medine14

Membre
Inscription
7 Décembre 2012
Messages
188
Réactions
15
Points
16 846
Bonjour à tous
Je ne poste pas souvent mais aujourd'hui j'ai besoin de votre aide !
J'ai une fonction en java :
Java:
static int bo(int n){
      if(n<=0) return 3;
      if(n==1) return 1;
      if(n==2) return 2;
      return 3*bo(n-3) + bo(n-2);
}

j'ai ici la fonction sous sa forme récursive terminale :
Java:
static int boTerm(int n, int b1, int b2, int b3){
      if(n <= 1)
         return b1;
      return boTerm(n-1,3*b3+b2,b1,b2);
}

Mais je ne comprends toujours pas comment arriver à ce résultat..
Je sais que j'ai peu de chance de tomber sur quelqu'un qui pourra m'aider mais bon je tente :)
Merci à vous !
 

Paul GTP

Légende vivante
VIP
Inscription
15 Août 2013
Messages
6 194
Réactions
7 545
Points
24 772
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.
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

Membre
Inscription
7 Décembre 2012
Messages
188
Réactions
15
Points
16 846
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:

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