Récursion terminal

Paul GTP

medine14 a dit:
Il me semble qu'on peut passer d'une fonction récursive non terminale à une fonction récursive terminale sans forcément comprendre ce que calcule la fonction.
Cliquez pour agrandir...
Je pense que tu as mal compris ton cours :mmh:
Une fonction récusrive terminale c'est une fonction qui appelle une autre fonction sans effectuer de calcul derrière :p

Ta fonction bo retourne ceci:
Code:
return 3*bo(n-3) + bo(n-2);
Elle n'est donc pas terminale car en plus de bo("quelque chose"), tu fais des opérations. Elle aurait pu être terminale si ça le résultat avait été ça par exemple
Code:
return bo(n-1);
Car il n'y a qu'un seul appel de fonction dans ton return et qu'il n'y a aucun calcul derrière... ce qui est le cas dans ton boTerm (qui, comme son nom l'indique, est une fonction récursive terminale)
Code:
return boTerm(n-1,3*b3+b2,b1,b2);
Il n'y a pas de calculs, tu return juste la fonction.

Il n'y a pas, à ma connaissance, moyen de passer d'une fonction récursive non terminale à une fonction récursive terminale sans trop comprendre pourquoi.
Il suffit de regarde étape par étape ce que fait l'algorithme et faire en sorte qu'il le soit.

En l'occurrence, il faut justement comprendre ce que fais ta fonction pour comprendre comme la rendre terminale...
Certains peuvent sans doute y arriver sans mais je trouve ça plus facile de d'abord comprendre et après "convertir" :p

Bonne chance :espion:
 

medine14

Paul GTP a dit:
Je pense que tu as mal compris ton cours :mmh:
Une fonction récusrive terminale c'est une fonction qui appelle une autre fonction sans effectuer de calcul derrière :p

Ta fonction bo retourne ceci:
Code:
return 3*bo(n-3) + bo(n-2);
Elle n'est donc pas terminale car en plus de bo("quelque chose"), tu fais des opérations. Elle aurait pu être terminale si ça le résultat avait été ça par exemple
Code:
return bo(n-1);
Car il n'y a qu'un seul appel de fonction dans ton return et qu'il n'y a aucun calcul derrière... ce qui est le cas dans ton boTerm (qui, comme son nom l'indique, est une fonction récursive terminale)
Code:
return boTerm(n-1,3*b3+b2,b1,b2);
Il n'y a pas de calculs, tu return juste la fonction.

Il n'y a pas, à ma connaissance, moyen de passer d'une fonction récursive non terminale à une fonction récursive terminale sans trop comprendre pourquoi.
Il suffit de regarde étape par étape ce que fait l'algorithme et faire en sorte qu'il le soit.

En l'occurrence, il faut justement comprendre ce que fais ta fonction pour comprendre comme la rendre terminale...
Certains peuvent sans doute y arriver sans mais je trouve ça plus facile de d'abord comprendre et après "convertir" :p

Bonne chance :espion:
Cliquez pour agrandir...

Un grand merci à toi pour le temps que tu as pris pour me répondre,
Je comprends un peu mieux.
Exam dans une semaine je te tiens au courant ahahah :)
 
Haut Bas