Le calcul des Nombres de Fibonacci de manière Récursive en C
Je suis en train d'apprendre le C en écrivant un programme simple à la sortie de la suite de Fibonacci. Il n'est pas de travail.
de fibonacci.h
unsigned int fibonacci_recursive(unsigned int n);
de fibonacci.c
#include <stdio.h>
#include "fibonacci.h"
main() {
unsigned int i;
for (i = 0; i < 10; i++) {
printf("%d\t%n", fibonacci_recursive(i));
}
getchar();
}
fibonacci_recursive.c
unsigned int fib_rec(unsigned int n);
main(unsigned int n) {
return fib_rec(n);
}
unsigned int fib_rec(unsigned int n) {
if (n == 0) {
return 0;
}
if (n == 1) {
return 1;
}
return fib_rec(n - 1) + fib_rec(n - 2);
}
C'est le message d'erreur par rapport à 2010 me donne quand j'essaie de construire le projet:
1>ClCompile:
1> fibonacci_recursive.c
1>fibonacci_recursive.obj : error LNK2005: _main already defined in fibonacci.obj
1>fibonacci.obj : error LNK2019: unresolved external symbol _fibonacci_recursive referenced in function _main
1>c:\users\odp\documents\visual studio 2010\Projects\Fibonacci\Debug\Fibonacci.exe : fatal error LNK1120: 1 unresolved externals
1>
1>Build FAILED.
1>
Ce que je fais mal? Merci pour votre aide à quelqu'un de nouveau à C.
Je pense que vous êtes confus au sujet de la fin de main(), ce n'est pas la fonction principale du fichier, mais de l'ensemble du programme. Le nom du fichier n'est pas pertinent dans c.
double possible de Deux fichiers contenant la définition de la fonction main() de Visual Studio?
double possible de Deux fichiers contenant la définition de la fonction main() de Visual Studio?
OriginalL'auteur Nick Heiner | 2010-01-31
Vous devez vous connecter pour publier un commentaire.
Votre approche semble étrange, vous devriez avoir:
main.c
) avec la méthode principale et qui comprendfibonacci.h
fibonacci.h
avec le prototypeunsigned int fibonacci_recursive(unsigned int n);
fibonacci.c
avec la mise en œuvre de la méthode, et il doit inclurefibonacci.h
tropEn fait, vous définissez
main
fonction deux fois de trop..principal.c
de fibonacci.h
de fibonacci.c
oublié de corriger une faute de frappe, il a été fib_rec.. je ne sais pas de façon de façon de nommer la même fonction 😀
Un autre utilisé supprimé un post dans lequel il a souligné le fait que vous êtes à l'aide de %s à l'intérieur de l'printf chaîne. Avec \n
OriginalL'auteur Jack
Vous avez le
main()
fonction définie deux fois dans votre projet. C'est le point d'entrée de votre programme, et vous avez seulement besoin d'une.OriginalL'auteur andri
Vous avez besoin \n non %n pour votre printf. Aussi, vous pouvez simplifier:
Merci pour le commentaire. C'était une faute de frappe:
(n <= 2)
devraient ai été(n < 2)
. J'ai corrigé maintenant et testé. Vous n'avez pas besoin de trois façon condition.Bon, nous sommes donc sur la même page 🙂
OriginalL'auteur Ramashalanka
Vous n'avez pas créé de fibonacci_recursive fonction que vous avez déclaré dans fibonacci.h.
OriginalL'auteur Tor Valamo
Vous avez déclaré deux
main()
fonctions, et le caractère de nouvelle ligne est '\n'.OriginalL'auteur stackptr
Bien, je tiens à préciser avant que la fonction récursive n'est pas une méthode efficace pour calculer Fibonacci et il peut être utilisé pour les dev de formation/démonstrations seulement, parce que chaque récursion est stockée dans la pile, et il peut également débordement pour grand nombres de fibonacci.
C'est plutôt la valeur de l'effort d'écrire plus efficace en fonction de Fibonacci qui utilise une boucle, comme le code suivant:
Essayer de comparer par vous-même, l'exécution de ./fibonacci à 50 avec cette méthode, par exemple sur un faible coût de processeur (par exemple. sur un Raspberry PI), et celui avec la fonctions récursives et 50 premiers numéros, et voyez la différence! ,-)
register
, en particulier entreunsigned
etint
: bien qu'il n'est pas une erreur, il est tout à fait inutiles et de mauvaise valeur pédagogique pour les débutants lecteurs.fibonacci()
est définie comme le retourint
mais n'a pas dereturn
déclaration.MAX_ITERS
devrait être nomméDEFAULT_ITERS
. Pourquoi avez-vous définiriters
eti
commeunsigned
? si vous passez une valeur négative comme un argument de ligne de commande pourmain
, vous finissez par itération pour un temps très long. Vous oubliez aussi inclure<stdlib.h>
pouratoi()
. Vous devriez certainement tourner les avertissements pour éviter toutes ces erreurs.Juste sûr, chqrlie, pour manque d'inclure pour atoi, je m'excuse, je l'ai raté.. mais en l'appelant MAX_ITERS ou DEFAULT_ITERS n'est qu'un "naming" la matière. Je veux dire, je suis d'accord avec vous pour rendre un code facile à lire, mais merci de ne pas être si grave .. 🙂 que ces dossiers n'est pas parce que je pense que c'est un non-sens pour passer d'un nombre négatif juste pour préciser un certain nombre d'itérations. Ce qui concerne.
OriginalL'auteur gabolander