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
Répondre
Deux méthodes concurrentes du haut de ma tête:
- données globales statiques
- transformer var $ de telle sorte que vous pouvez détecter combien de fois il a été manipulé
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
"façon naturelle"? !! L'esprit boggle! Connaissez-vous * un * langage qui a une "façon naturelle" de le faire? – wallyk
wallyk- je suis un programmeur débutant, donc je ne connais pas très bien les modèles de récursion – babonk
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.
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.";
}
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);
La partie récursive de cette lecture ne devrait-elle pas lire if (n> 0) {myFunction (var n); } '? – Armstrongest
@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
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
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}
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.
- 1. fonction récursive en java - N boucles imbriquées avec indicies changeantes
- 2. exécuter une fonction dans une autre fonction dans N fois
- 3. Croix Rejoindre 'n' fois une table
- 4. Qui mange ma \ n
- 5. Comment utiliser RewriteCond% N
- 6. La plus longue chaîne qui apparaît n fois
- 7. Démontrer ou réfuter n^2 - n + 2 ∈ O (n)
- 8. Itère brassé [0..n) sans tableaux
- 9. Perl regexp/(\ r \ n | \ r | \ n)/
- 10. n * n table vs (n^2) * 3 table dans mysql
- 11. Disposition de n objets dans un carré n x n
- 12. En analyse asymptotique, Montrer que: - O (f (n) + g (n)) = O (max {f (n), g (n)})
- 13. fonction récursive
- 14. clé étrangère et la relation n à n
- 15. Appel automatique de la fonction n ° 2 lors de l'appel de la fonction n ° 1
- 16. passer \ n en javascript
- 17. différence entre PHP \ r \ n \ n
- 18. Comment faire une icône répétant N fois où N est une variable?
- 19. comment changer \\ n en \ n en perl
- 20. Comment utiliser "class" le mot comme paramètre fonction appelle en python
- 21. Regex (C#): Remplacer \ n avec \ r \ n
- 22. Comment calculer n log n = c
- 23. Que fait le code bit à bit "$ n & ($ n - 1)"?
- 24. Comment puis-je exprimer un n factoriel! avec une fonction F #, récursive ou non?
- 25. ADO.NET Entity Framework: relations QUERY n-n
- 26. La langue A = {0^n 1^n 0^n} est-elle libre de contexte?
- 27. héritage n variables statiques
- 28. Question d'algorithmes sur une matrice n * n de distances
- 29. Fonction récursive qui résume les chiffres impairs d'un entier
- 30. mysql procédure stockée qui appelle lui-même récursive
Pourquoi est-ce marqué à la fois php et langage-agnostique ??? –
Peut-être que, quoi que '$ var' soit, la fonction se répète exactement 3 fois. – BoltClock
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