[C] Probleme dans cette fonction

Résolu/Fermé
touf_truc Messages postés 57 Date d'inscription samedi 21 octobre 2006 Statut Membre Dernière intervention 23 avril 2007 - 15 févr. 2007 à 17:07
jro-daemon Messages postés 10 Date d'inscription mardi 13 février 2007 Statut Membre Dernière intervention 24 février 2007 - 16 févr. 2007 à 13:34
bonsoir;
mystere est une fonction recursive, esque je peux l'ecrire la fonction mystere d'une façon non recurcive?


#include<stdio.h>
long int mystere(int n)
{
if(n==0)
return 2;
else
if(n==1)
return 1;
else
return (2*mystere(n-1)+4*mystere(n-2));
}
main()
{
int n;
do
{
printf("\n Introduire un nombre : ");
scanf("%d",&n);
}
while(n<0);
printf("\n mystere de %d = %ld ",n,mystere(n));
}
A voir également:

5 réponses

touf_truc Messages postés 57 Date d'inscription samedi 21 octobre 2006 Statut Membre Dernière intervention 23 avril 2007 1
15 févr. 2007 à 17:57
non;
on remplace la fonction

long int mystere(unsigned int n)
{
if (n==0) return 2;
else if (n==1) return 1;
return (2*mystere(n-1)+4*mystere(n-2));
}

par une autre fonction non recursive,
ou elle calcul mystere(n) par methode iterative
1
mamiemando Messages postés 33079 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 23 avril 2024 7 749
16 févr. 2007 à 01:13
Ok!
1
mamiemando Messages postés 33079 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 23 avril 2024 7 749
15 févr. 2007 à 17:37
C'est bon a deux trois détails près
#include <stdio.h>

long int mystere(unsigned int n)
{
        if (n==0) return 2;
        else if (n==1) return 1;
        return (2*mystere(n-1)+4*mystere(n-2));
}

int main(){
        int n;
        do{
                printf("\nIntroduire un nombre : ");
                scanf("%d",&n);
        }while(n<0);
        printf("mystere de %d = %ld\n",n,mystere((unsigned int)n));
        return 0;
}

En particulier la fonction main doit retourner 0 quand tout va bien (par convention), et on peut préciser un peu les types (utiliser unsigned int autant que posible)

Bonne chance
0
mamiemando Messages postés 33079 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 23 avril 2024 7 749
15 févr. 2007 à 18:22
Je t'en prie on te regarde :-) Et si tu peux faire apreil avec des suites de fibonacci ça m'intéresse aussi.
0
jro-daemon Messages postés 10 Date d'inscription mardi 13 février 2007 Statut Membre Dernière intervention 24 février 2007 1
16 févr. 2007 à 01:01
Salut,
pour les suites de Fibonacci en mode itératif, je propose ce code-ci:
#include<stdio.h>
long fibonacci(unsigned int n)
{
  long fnm2 = 0; //fibonacci de n moins 2.
  long fnm1 = 1; //fibonnaci de n moins 1.
  long fn; //fibonacci de n
  int i;
 if (n <= 1)
 fn = n
 else
 {
  for(i=2;i<=n;i++)
  {
    fn = fnm1 + fnm2;
    fnm2 = fnm1;
    fnm1 = fn;
  }
 }
 return fn;
}

Bon voilou. D'accord, c'est moins naturel que l'algo récursif c'est sûr mais bon, on y arrive.
Cordialement,
Johnny D.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Char Snipeur Messages postés 9696 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023 1 297
16 févr. 2007 à 09:50
Salut.
C'est clair, qu'il est toujours possible d'écrire une fonction récursive en itératif, après tout, ce n'est qu'une boucle.
La solution itérative est moins élégante, mais elle utilise moins de mémoire pour les grand nombres.
Pour les polynomes de legendre j'avai tester ces deux méthodes, et dans ce cas, l'itérative était en plus beaucoup plus rapide.
0
jro-daemon Messages postés 10 Date d'inscription mardi 13 février 2007 Statut Membre Dernière intervention 24 février 2007 1
16 févr. 2007 à 13:34
Salut,
En fait pour moi, itératif et récursif c'est la même chose. Le tout est de savoir quelle solution adoptée suite au problème auquelle on doit faire face. Le calcul récursif quelquefois en se "répétant" calcule des données qui sont parfois inutiles et qui peuvent coûter en mémoire si les calculs sont éxécutées un grand nombre de fois.
En fait, on dit à peu près la même chose. :-)
Cordialement,
Johnny D.
0