Matrice et recursion
adamsjilal
Messages postés
46
Date d'inscription
Statut
Membre
Dernière intervention
-
Reivax962 Messages postés 3672 Date d'inscription Statut Membre Dernière intervention -
Reivax962 Messages postés 3672 Date d'inscription Statut Membre Dernière intervention -
bonsoir,
enfaite j'etait entrain de travailler sur javascript sur un projet d'etude et du coup j'ai rencontré un probleme que j'arrive pas a surmonter depuis deux jours. mon probleme j'ai travailler sur le recursion et du coup voila aujourd'hui je suis amener a faire un projet la dessus.
donc c'est je veux ce que j'ai une matrice composé de carré , du coup chaque case contient un nombre entier et du coup lorsque ce nombre depasse le trois, je veux ajouter de un a ses voisins et lui je doit retrancher de trois. plus precisement chaque il a quatre voisins(comme c'est un carré il ne peut y avoir plus).
donc j'ai proposé ce code mais ca produits rien.
voici la methode qui permet d'initialiser aleatoirement les case:
et voila le code que j'ai mit en place et qui me pose probleme
et enfin la methode update_grid
s'il en y a quelqu'un m'a compris je voudrait une aide ou une suggestion de votre part merci d'avance.
enfaite j'etait entrain de travailler sur javascript sur un projet d'etude et du coup j'ai rencontré un probleme que j'arrive pas a surmonter depuis deux jours. mon probleme j'ai travailler sur le recursion et du coup voila aujourd'hui je suis amener a faire un projet la dessus.
donc c'est je veux ce que j'ai une matrice composé de carré , du coup chaque case contient un nombre entier et du coup lorsque ce nombre depasse le trois, je veux ajouter de un a ses voisins et lui je doit retrancher de trois. plus precisement chaque il a quatre voisins(comme c'est un carré il ne peut y avoir plus).
donc j'ai proposé ce code mais ca produits rien.
voici la methode qui permet d'initialiser aleatoirement les case:
function random_grid_grain(alea){ for (var i = 0; i<taille1;i=i+1) { grid[i] = []; for (var j = 0; j < taille2 ; j = j+1) { grid[i][j]=alea; } } return grid; }
et voila le code que j'ai mit en place et qui me pose probleme
$("#step").on("click",function(){ matrice = random_grid_grain(alea); for(var i = 0 ; i < matrice.length ; i ++){ matrice[i]=[]; for (var j = 0; j < matrice.length; j++) { if(matrice[i][j]>3){ matrice[i][j] -=3; matrice[i-1][j]++; matrice[i][j+1]++; matrice[i+1][j]++; matrice[i][j-1]++; update_grid(matrice,colors); } } } });
et enfin la methode update_grid
function draw_grid(data, colors,taille1,taille2) { var color_obj = {}; for (var i = 0; i < colors.length; i+=2) { color_obj[colors[i]] = colors[i+1]; } var width = taille1; var height = taille2; var grid_length = data.length; var width_cell = width/grid_length; var height_cell = width/grid_length; var canvas = document.getElementById("grid") if (canvas == null) { canvas = document.createElement('canvas'); canvas.id = "grid"; canvas.width = 600; canvas.height = 600; document.getElementsByTagName('body')[0].appendChild(canvas); } var context = canvas.getContext("2d"); function draw_cells(){ for (var i = 0; i < grid_length; i++) { for (var j = 0; j < grid_length; j++) { if (_data && _data[i][j] === data[i][j]) { continue; } context.fillStyle = color_obj[data[i][j]]; context.fillRect(i*width_cell, j*height_cell, width_cell, height_cell); } } } draw_cells(); if (!_data) { _data = []; } for (var i = 0; i < grid_length; i++) { _data[i] = data[i].slice(); } } function update_grid(data,colors) { draw_grid(data, colors,taille1,taille2); }
s'il en y a quelqu'un m'a compris je voudrait une aide ou une suggestion de votre part merci d'avance.
A voir également:
- Matrice et recursion
- La tentative de récursion de substitution d'image ✓ - Forum Windows
- Diagonale secondaire d'une matrice - Forum C
- Excel vous ne pouvez pas modifier une partie de matrice ✓ - Forum Excel
- Vous ne pouvez pas modifier une partie de matrice - Forum Excel
- La tentative de récursion de substitution d'image s'annule - Forum Logiciels
1 réponse
Bonjour,
Pour commencer, quelques remarques d'ordre plus général :
- je ne vois aucune récurrence dans ton code, uniquement de l'itératif (ce n'est pas un mal !)
- quel rafraîchissement visuel de ta grille tu souhaites avoir ? Tu veux visualiser les « explosions » se propager, de gauche à droite puis de bas en haut ? Ou avoir uniquement le résultat final ?
- si tu veux voir les explosions se propager, souhaites-tu qu'elles soient résolues de façon itérative (on parcourt tout le tableau plusieurs fois jusqu'à ce que plus rien ne change) ou récursive (parcours du tableau en arbre, à chaque fois qu'on fait +1 sur une case on vérifie son état et on le résout avant de passer à la suite)
À première vue je dirais que le résultat final sera le même quel que soit l'ordre de résolution.
Par contre le code pour le générer va bien changer.
- attention, pour une matrice suffisamment « chaude » initialement et grande (avec plus de cases centrales que de coins), tes règles amènent vers un réchauffement infini, donc tu n'auras pas d'état final. En effet, les coins refroidissent l'ensemble (une explosion se solde par une température finale de -3 +1 +1 = -1), les bords sont neutres, et les cases centrales font +1. Ta matrice va donc se refroidir par les coins et s'auto-entretenir voire s'emballer par le centre.
Maintenant, les problèmes que je vois dans ton code :
- telle que construite, ta matrice va contenir la même valeur partout. Du coup si Alea vaut 1, rien ne se passe nulle part...
- ta fonction qui fait les +1 / -3 ne parcours qu'une seule fois tout le tableau, il restera donc des cases >3 à la fin
- l'updateGrid peut être optimisé parce que toute la grille est reparcourue à chaque fois. Tu dois pouvoir lui donner des paramètres pour ne mettre à jour que la case que tu sais avoir changé.
Xavier
Pour commencer, quelques remarques d'ordre plus général :
- je ne vois aucune récurrence dans ton code, uniquement de l'itératif (ce n'est pas un mal !)
- quel rafraîchissement visuel de ta grille tu souhaites avoir ? Tu veux visualiser les « explosions » se propager, de gauche à droite puis de bas en haut ? Ou avoir uniquement le résultat final ?
- si tu veux voir les explosions se propager, souhaites-tu qu'elles soient résolues de façon itérative (on parcourt tout le tableau plusieurs fois jusqu'à ce que plus rien ne change) ou récursive (parcours du tableau en arbre, à chaque fois qu'on fait +1 sur une case on vérifie son état et on le résout avant de passer à la suite)
À première vue je dirais que le résultat final sera le même quel que soit l'ordre de résolution.
Par contre le code pour le générer va bien changer.
- attention, pour une matrice suffisamment « chaude » initialement et grande (avec plus de cases centrales que de coins), tes règles amènent vers un réchauffement infini, donc tu n'auras pas d'état final. En effet, les coins refroidissent l'ensemble (une explosion se solde par une température finale de -3 +1 +1 = -1), les bords sont neutres, et les cases centrales font +1. Ta matrice va donc se refroidir par les coins et s'auto-entretenir voire s'emballer par le centre.
Maintenant, les problèmes que je vois dans ton code :
- telle que construite, ta matrice va contenir la même valeur partout. Du coup si Alea vaut 1, rien ne se passe nulle part...
- ta fonction qui fait les +1 / -3 ne parcours qu'une seule fois tout le tableau, il restera donc des cases >3 à la fin
- l'updateGrid peut être optimisé parce que toute la grille est reparcourue à chaque fois. Tu dois pouvoir lui donner des paramètres pour ne mettre à jour que la case que tu sais avoir changé.
Xavier
adamsjilal
Messages postés
46
Date d'inscription
Statut
Membre
Dernière intervention
oui je veux voire les explosions se propager dans le quatre coin. et puis je voulais employer la recursivité. et du coup vous avez parlez du temperature de truc du genre dont j'ai pas compris. mais le plus important que vous avez compris mon probleme. et ce que je veux visualiser les explosition et les propagation. merci
Reivax962
Messages postés
3672
Date d'inscription
Statut
Membre
Dernière intervention
1 011
(Oui j'ai utilisé le terme de "température" pour parler de la valeur de chaque case, désolé c'était pas très clair... Chaud quand ça monte, froid quand ça baisse...)
Reivax962
Messages postés
3672
Date d'inscription
Statut
Membre
Dernière intervention
1 011
Du coup dans ton code, quand "rien ne se passe", tu es sûr que "alea" est supérieur ou égal à 3 ?
adamsjilal
Messages postés
46
Date d'inscription
Statut
Membre
Dernière intervention
je fait de tel sorte que je choisi la valeur alea superieur a 3 pour visualiser le propagation
adamsjilal
Messages postés
46
Date d'inscription
Statut
Membre
Dernière intervention
sinon au debut tout les case ont la meme valeur de alea.