2010-12-10 4 views
1

Supposons que ma fonction myFunction ($ var) existe. Il va manipuler $ var, en l'appelant 3 fois avant de retourner finalement $ var. Y at-il un moyen de le faire sans stocker le nombre de fois qu'il a été appelé dans les paramètres?Fonction récursive qui appelle elle-même n fois sans utiliser n comme paramètre

+0

Pourquoi est-ce marqué à la fois php et langage-agnostique ??? –

+0

Peut-être que, quoi que '$ var' soit, la fonction se répète exactement 3 fois. – BoltClock

+0

Carlos - parce qu'il pourrait y avoir un raccourci en PHP, mais cela pourrait être aidé par ceux qui connaissent n'importe quelle langue. BoltClock-nope, $ var n'a aucun rapport avec le nombre de fois, c'est juste un tableau qui est manipulé sans référence à cela – babonk

Répondre

2

Deux méthodes concurrentes du haut de ma tête:

  1. données globales statiques
  2. transformer var $ de telle sorte que vous pouvez détecter combien de fois il a été manipulé
+0

Basé sur les commentaires ci-dessus, il semble que ces astuces sont la seule façon. Aller à accepter comme une réponse s'il n'y a pas de façon naturelle de le faire – babonk

+0

"façon naturelle"? !! L'esprit boggle! Connaissez-vous * un * langage qui a une "façon naturelle" de le faire? – wallyk

+0

wallyk- je suis un programmeur débutant, donc je ne connais pas très bien les modèles de récursion – babonk

0

Vous ne dites pas ce qui se passe après les appels récursifs, donc ...

setrlimit(RLIMIT_STACK) pour une petite valeur d/ou consomme suffisamment d'espace de pile dans les autres appels que myFunction() ne peut se répéter que 3 fois avant d'abandonner en raison d'un manque d'espace de pile.

1

Vous pouvez utiliser l'instruction statique pour définir un var et vérifier sa valeur chaque fois que vous entrez (en l'incrémentant chaque fois, bien sûr, au fur et à mesure que vous entrez, en décrémentant lorsque vous quittez). Voici un article sur le concept de base. http://www.bellaonline.com/articles/art29070.asp

Le code correspondant est

function count_calls() 
{ 
static $no_calls = 0; 
$no_calls++; 
echo "This function has been called $no_calls times."; 
} 
2

Une façon de le faire est de rendre les n en option et par défaut 3 sinon défini. Je ne sais pas la syntaxe PHP pour cela, mais puisqu'il est la langue agnostique étiquetée est ici l'équivalent javascript:

function myFunction (var, n) { 
    if (n == undefined) { 
     n = 3; 
    } 

    doSomethingWith(var); 

    n--; 

    if (n) { 
     myFunction(var, n); 
    } 
} 

// called like this: 
myFunction(someVar); 
+0

La partie récursive de cette lecture ne devrait-elle pas lire if (n> 0) {myFunction (var n); } '? – Armstrongest

+0

@Armstrongest: Je ne m'attends pas à ce que 'n' soit inférieur à 0. Mais oui, d'un point de vue défensif, vérifier' n> 0' est plus sûr que de vérifier si 'n' est zéro (faux) – slebetman

+0

Oui, je reçois ça ... Je l'ai toujours trouvé déconcertant en me basant sur! 0 = vrai. Doit être tout le temps que j'ai passé avec des langues qui ont des types forts comme 'C#' et 'Java'. Il semble juste préférable d'être explicite dans le code. – Armstrongest

0

Quelques langages fonctionnels soutiennent ce type de construction.

Dans Mathematica, par exemple, vous pouvez définir:

 f[i_, n_: 3] := Nest[# + 7 &, i, n]; 

Où 3 est une valeur par défaut pour n.

Alors

 f[2] 

Retours

 23 -> (2+7+7+7) 

et

 f[4,1] 

Retours

 11 (-> 4+7) 

Bien sûr, vous pouvez également définir

 f[i_] := Nest[# + 7 &, i, 3]; 

si vous n'avez pas besoin d'ajuster le nombre d'appels récursifs.


Ceci est peut-être plus intéressant. Vous pouvez également demander tous les résultats intermédiaires.

Donc, si vous définissez:

g[i_, n_: 3] := NestList[# + 7 &, i, n]; 

puis

g[2] Returns {2, 9, 16, 23} 
0

Si vous savez que votre fonction s'appeler exacly trois fois, quatre avec le temps vous appelé, il est mieux pour rendre une fonction plus simple, non récursive et rendre l'appel explicite:

simpleF(simpleF(simpleF(simpleF($var))))

Moins élégant, mais plus facile à entretenir.

Bien sûr, cela ne correspondrait pas à un plus grand nombre.

Questions connexes