9
votes

Fonctions récursives dans JavaScript et suivi de profondeur

J'écris une fonction récursive dans JS et avoir des problèmes. Commençons par cette fonction très basique: xxx

de sorte que cela fonctionne bien, et profondeur agit comme un variété statique, mais le problème est que dans une langue comme C Cela comporte des Vares statiques appropriés, lorsque vous revenez hors de la fonction, cette variable diminuait (apparemment). Il s'agit donc d'une véritable profondeur. Si j'ai trois cases contenant trois boîtes et chacune d'elles contiennent trois boîtes, etc., nous sommes essentiellement percés dans les plus profonds jusqu'à ce qu'il n'y ait pas d'enfants, puis soutenant un niveau à un frère et traversant ses enfants . Le problème avec le code ci-dessus est que la profondeur continue d'augmenter et de se développer infiniment, même si la profondeur de vérité ne peut être que 3 ou 4 de la plus ancienne ancêtre au plus jeune enfant. S'il y a 80 frères et sœurs à chaque niveau, ce compteur de profondeur va monter en flèche.

Comment puis-je garder une trace de la profondeur réelle dans les fonctions récursives JS?


3 commentaires

Pourquoi ne pas décrémenter la traverse.Depth après la dernière condition si?


Pour démarrer, vous n'avez pas montré de code qui décrémente la valeur de traverse.depth ...


Je suis désolé de voter de fermer comme une duplication - celle que j'ai liée à ne semble pas fonctionner pour la récursivité.


5 Réponses :


18
votes

Ne fixez pas le compteur à la fonction. Le compteur est partagé par tous les appels récursifs, le compteur représente donc le nombre d'appels de fonction, au lieu de la profondeur de la récursion.

Lorsque Profondeur code> est transmis comme une variable distincte, le compteur affiche la véritable profondeur. . P>

function traverse(thing, depth)
{
    if (typeof depth == 'number')
        depth++;
    else
        depth = 1;

    if (thing.child)
        traverse(thing, depth);
}


4 commentaires

Il n'y a pas d'objet adopté par référence ici, il attache une propriété à l'objet de la fonction elle-même ...


Il y a une autre solution, mais cela semble être le plus concis et élégant. Merci.


@Jondavidjohn vous avez raison (j'ai lu chose.depth ). L'explication de la solution est toujours, cependant.


@ROBW n'a aucun doute, voulait simplement que nous ne confondons pas les gens de la raison pour laquelle cela fonctionne (et ne fonctionnait pas en premier lieu).



3
votes

Pourquoi ne pas simplement modifier la signature de la fonction pour prendre une chose et un index? Donc, vous l'appelleriez comme suit:

function traverse(thing, idx)
    ...
    if (condition)
        traverse(thing.child, ++idx)


0 commentaires

1
votes

Il suffit d'ajouter: xxx

juste avant les déclarations de retour. Donc xxx

deviendrait: xxx

puis ajouter traverse.depth -; Avant votre fermeture } de la fonction.


0 commentaires

1
votes

Si je comprenais correctement, cela me semble que vous voulez suivre la profondeur de la récursion .. Mais dans votre code, vous ne décrémentez jamais la profondeur lorsque vous avez terminé 1 niveau dans la récursion.

J'ai essayé un code simple. et je pense que ceci ce que vous vouliez, p>

démo strong> p>

html: strong> p> xxx pré>

JS: strong> p>

012345678876543210


0 commentaires

7
votes

Une autre solution (et peut-être plus belle) serait d'utiliser des atouts de programmation fonctionnelle JS et d'utiliser une fonction haut de gamme pour maintenir tout le ménage lié à la profondeur en dehors de la fonction principale. Considérez, par exemple, l'exemple classique suivant:

 console.log(fac(10)) // 3628800
 console.log(fac(100)) // Too much recursion


0 commentaires