JS Récursion

Fermé
Julien - Modifié par Julien le 19/11/2011 à 11:52
 Julien - 19 nov. 2011 à 19:09
Bonjour,

j'ai réalisé un petit script en js concernant la résolution d'une grille de sudoku avec une fonction récursive.


La résolution fonctionne mais j'ai tout de même un problème:


Pour comprendre voici l'essentiel du script


window.onload=function() 
{ 
 // Exemple   
 sudoku = '100006000050700003009020000040500300000090050000000074070800040600000800002001000'; 
  
 document.getElementById("start").onclick = function() 
 { 
  // Initialisation du chrono 
  var d = new Date(); 
  start_time = d.getTime(); 
  show2(sudoku); // Affichage de la grille de départ 
  solve(sudoku); // Résolution de la grille 
  // Affichage du chrono 
  var d = new Date(); 
  var secs = (d.getTime() - start_time)/1000; 
  document.getElementById("chrono").value = secs+'s'; 
 } 
}


et la fonction solve

function solve(su) 
{ 
 nb++; // Compteur 
  
 /* ISOLER LES VARIABLES */ 
 var _sud = su, _nsud, _sudlen = _sud.length, 
 _sol = find_sol(_sud), _nsol,   
 _isud, _listsol, _ils; 

 if(_sol === false) return false; // Aucune solution 
  
 _isud = _sol[0], _listsol = _sol[2]; 
  
 for(_ils in _listsol) // Parcours des solutions de la case 
 { 
  _nsud = _sud.substr(0, _isud)+_listsol[_ils]+_sud.substr(_isud+1, _sudlen); 
  //sudoku = _nsud; // Maj du sudoku global 
  document.getElementById("s"+_isud).value = _listsol[_ils]; 
  var test = solve(_nsud); 
  if(nb_libre(_nsud) == 0 || test == true) // Le sudoku est complet 
  { 
   //show2(sudoku); 
   return true; 
  } 
  document.getElementById("s"+_isud).value = 0; 
 } 
  
 return false; 
}


Normalement quand je click sur le bouton j'ai devrais voir la grille de départ et ensuite la résolution se lance mais la il effectue la résolution et après il affiche la grille de départ (si je n'affiche rien dans la fonction solve), incroyable ...


Et pour finir même si je lui demande de mettre à jour la grille pendant la résolution il fait tout mais une fois la résolution terminée.


la seul solution que j'ai trouvé c'est de mettre un setTimeout pour le premier problème
et de faire une alert dans la fonction solve (que je bloque par la suite avec le navigateur)
et la sa fonctionne mais en contrepartie le temps de résolution devient incroyablement long.

Quelqu'un aurait une idée ?

Merci d'avance

1 réponse

up
0