2014-05-08 1 views
-1

J'essaie d'écrire un programme récursif où l'appel de fonction suivant est basé sur les données de l'itération précédente.Récursivité dans node.js

Pour vous donner une idée de ce que je suis en train de faire:

vous commencez au point un et vous êtes intéressés où vous pouvez aller à partir de ce point, de sorte que l'algorithme recherche pour une destination possible b, maintenant vous vous voulez recommencer l'algorithme avec le point de départ b jusqu'à ce que vous atteigniez un deadend, à partir de là vous revenez un peu en arrière pour voir si vous pouvez aller n'importe où ailleurs et ainsi de suite.

À chaque itération, je sauve la façon dont je suis allé, donc à la fin, j'ai un réseau complet d'endroits où je peux aller.

Le problème est que je ne sais pas comment gérer les récursions de ce type dans node.js.

EDIT: Je résolu le problème et l'initialisation d'autres problèmes. Le programme s'exécute sans erreur maintenant mais il y a un problème que je ne comprends toujours pas: La variable "nodecounter" semble être réinitialisée à chaque itération de la boucle for de la fonction "separation". Si vous exécutez le programme maintenant, vous verrez comment les 4 premières lignes de mon tableau sectornodes sont remplies puis, après avoir frappé un deadend (en revenant à la première boucle for), il est écrasé au lieu d'ajouter de nouvelles lignes. Le "testarray" d'un autre côté ne perd pas les changements que "récursion" a fait en lui. Est-ce que quelqu'un voit le problème?

//testarray [startpoint, endpoint, marker] the marker defines if i have already visited a node (1) or not (0) 
var testarray = [ 
    [2323, 2324, 0], 
    [2326, 2322, 0], 
    [2324, 2328, 0], 
    [2322, 2321, 0], 
    [2321, 2322, 0], 
    [2328, 2324, 0], 
    [2324, 2323, 0], 
    [2329, 2326, 0] 
]; 

var separation = function(testarray){  //main function to start the recursion 
    var sectornodes = [];  // array with the results 
    var sectorcounter = 0;  // counts the different sectors which are independent from each other 
    var nodecounter = 0;  //counts the nodes (in order to fill my array) 

    for (var i=0; i < testarray.length; i++){ 
     sectornodes[i] = []; 
    } 
    for (var i=0; i < testarray.length; i++){ //check all start point 
     if (testarray[i][2] == 0){  //if we havent visited this place before ... 
     console.log(sectorcounter); 
      recursion(testarray[i][0], testarray, sectornodes, nodecounter, sectorcounter); //start the recursion with this node 
      sectorcounter++;   //after every iteration of the loop we enter a new sector 
     } 
    } 
    console.log(sectornodes); 
} 

var recursion = function(node, testarray, sectornodes, nodecounter, sectorcounter){  
    for (var j=0; j<testarray.length; j++){  //check every start point if he matches our node... 
     if (testarray[j][0] == node && testarray[j][2] == 0){ //...if he does and we havent visited it before, ... 
      sectornodes[nodecounter][0] = sectorcounter;  //...we add the route to our array... 
      sectornodes[nodecounter][1] = testarray[j][0]; 
      sectornodes[nodecounter][2] = testarray[j][1]; 
      console.log(sectornodes); 
      nodecounter++;          //...and raise the line counter 
      testarray[j][2] = 1; 
      //console.log(testarray); //output for debugging: the array should gain a 1 in the 3rd argument for every iteration 
      recursion(testarray[j][1], testarray, sectornodes, nodecounter, sectorcounter);       //now we start again with the end node to see where we can get from there on 
     } 
    } 
    console.log('deadend');  //output for debugging: output whenever a path hits a deadend (no further place where you havent been before) 
} 

separation(testarray); 
+5

« * Quelqu'un peut-il me donner le corps d'un code comme ça? * "Non. Postez vos tentatives (et vos recherches) d'abord. –

+0

Voilà, mon code jusqu'ici. Chaque fois que je recherche la récursivité, les données utilisées dans les exemples ne dépendent pas de sorte qu'il n'est pas comparable à mon problème. Mais je regarde toujours. – user3599232

Répondre

0

Vous recevez des erreurs de tableau non défini en raison des appels comme

sectornodes[nodecounter][0] = 'new'; 

Vous devez vous assurer que vous initialisez les sous-zones avant de les peupler

if(!sectornodes[nodecounter]){ 
    sectornodes[nodecounter] = []; 
} 
+0

Bonjour Comart et merci pour l'aide. J'ai changé mon code en initialisant tout le tableau avec une boucle for au début. Je vais mettre à jour mon code dans les prochaines minutes. – user3599232