2010-09-23 32 views
1

Mon professeur nous a demandé d'écrire un programme qui utilise la récursivité pour résoudre une séquence de fibonacci. Tout cela est normal, mais il nous a demandé de rendre notre fonction nulle. Cela fait quelques jours que je travaille là-dessus et je n'arrive pas à trouver un moyen de le faire.Résoudre la séquence Fibonacci Renvoyer récursivement vide dans la fonction

Je:

void fibonacci(double *n,double *x,double *y,double *result) { 
    if(*n == 1) 
      *result = 0; 
    else if(*n == 2) 
      *result = 1; 
    else 
      fibonacci(--n,n,(n-1),(n+(n-1))); } 

Est-ce que je fais? Je n'ai jamais eu besoin d'utiliser les paramètres avant et je ne suis pas sûr si je suis sur la bonne voie. Pour une raison quelconque, il est ne pas compiler à l'appel récursif à fibonacci, indiquant l'ajout de pointeur invalide. Merci!

+0

Medoo est vivant! – Wernight

+0

(1) Écrivez-en un qui fonctionne et qui ne renvoie pas de vide. (2), modifiez cette fonction pour écrire sa valeur de retour à un emplacement fourni par l'appelant, au lieu de la renvoyer. –

+0

Eh bien, je l'ai compris, en utilisant une fonction vide. Merci pour l'aide de tout le monde à éclaircir mes pensées, j'étais trop compliquer la question. –

Répondre

0

Puisque c'est un devoir, je ne vais pas fournir le code de travail, bien que quelques points ici:

  1. En utilisant une référence est plus simple que d'utiliser des pointeurs
  2. Vous devez vraiment augmenter le résultat, ne pas le mettre à 0 ou 1. Par conséquent, vous devez passer à l'appel de première fonction par référence un entier avec la valeur 0 assignée.
  3. Considérons la formule: f (n) = f (n -1) + f (n-2) pour tout n> 2; f (n) = 0 pour n = 1 et f (n) = 1 pour n = 2.
+0

Vous avez raison SOOO, m'a pris beaucoup de temps pour le voir, mais la façon progressive dont vous parlez est la meilleure façon de le faire, merci beaucoup pour votre aide et votre perspicacité. Maintenant, je dois calculer le temps de fonctionnement et le taux de croissance, amusant! –

4

Astuce: problème est là: fibonacci(--n,n,(n-1),(n+(n-1))); ou même juste là --n. Vous travaillez avec pointeurs

+1

+1 pour juste l'indice et de ne pas * gâcher * cet étudiant avec le code entier .. :) – liaK

3

Le compilateur a raison. Vous devez déréférencer les pointeurs dans l'appel, si vous utilisez des pointeurs.

Mais la solution plus simple serait d'utiliser ce prototype à la place (et correspondre à tout le code lui):

void fibonacci(int n, int *result). 
  • Je l'ai remplacé par deux int, parce que je ne vois pas pourquoi vous d utiliser double pour stocker des entiers.
  • J'ai supprimé x et y que vous n'utilisez pas dans votre fonction.
+0

Il a dit que nos cas de test auraient de très grands nombres, il veut que nous utilisions double à cause de cela. Je pense que faire n un nombre entier et aboutir à un double *, c'est le résultat qui deviendra ridiculement grand. Merci de votre aide! –

+0

Double n'est pas adapté pour stocker de très grands entiers ... Vous pouvez utiliser long long ou quelque chose comme ça. – jv42

+0

Oh et je pense que la pile de votre programme va exploser avant d'atteindre la valeur maximale des entiers (non signé ou signé). – jv42

0

non ce n'est pas le cas. Tout d'abord, vous soustrayez des pointeurs à float (at - n) qui pourrait facilement (même si vous le compilez et l'exécutez) produire une violation d'accès. Il se plaint correctement cependant sur les types. Les types que la fonction accepte sont des pointeurs et je parie que vous passez des flottants.

0

Utilisez ce pour un début:

void fibonacci(double n, double & result) { 
    if(n == 1) 
     result = 0; 
    else if(n == 2) 
     result = 1; 
    else { 
     // gotta figure that part out yourself 
    } 
} 

En déclarant result comme référence, votre modification va changer la valeur du paramètre réel passé. Puisque ceci est C++, les références devraient être préférées. Vous pouvez toujours déclarer n comme valeur normale, car vous ne souhaitez pas le modifier. L'appel est récursive vos devoirs maintenant :)

+1

C'est une solution plus compliquée avec un résultat égal à 0/1. Je n'en dirai pas plus puisque je ne peux pas fournir de code complet à la question des devoirs, mais essayez-vous :) –

+0

merci pour l'aide, oui je préfère le comprendre. Je demandais parce que mes paramètres commençaient à devenir fous et je pense que je suis compliquer cela. Merci les gars! –

0

Je pense que ce doit être comme ceci:

void fibonacci_list() 
{ 
    int count,next=1,prev1=0,prev2; 
    printf("1"); 
    for(count=2;count<=12;count++) 
    { 
     prev2=prev1; 
     prev1=next; 
     next=prev1+prev2; 
     printf("%d ",next); 
    } 
    printf("..."); 
    return; 
} 
+0

Je ne peux pas voir la récursivité dans cela ... –