2010-07-02 3 views

Répondre

17

Utilisation récursion:

alt text


Version en C/C++ langue:

int fib(int a) 
{ 
    if (a == 0) return 0; 
    if (a == 1) return 1; 
    return fib(a - 1) + fib(a - 2); 
} 

Appliquer la suggestion de ce commentaire réponse:

Version en langage C:

/* 
* -1 is a error handler 
*/ 
int fib(int a) 
{ 
    if (a < 0 || a > 47) return -1; 
    if (a == 0) return 0; 
    if (a == 1) return 1; 
    return fib(a - 1) + fib(a - 2); 
} 

Version en langage C++:

int fib(int a) 
{ 
    if (a < 0) throw new std::out_of_range("Fibonacci is not defined for negative sign values."); 
    if (a > 47) throw new std::overflow_error("Fibonacci for this value was overflow the integer."); 
    if (a == 0) return 0; 
    if (a == 1) return 1; 
    return fib(a - 1) + fib(a - 2); 
} 
7

Je suppose que si vous ne pouvez pas utiliser des boucles que votre professeur/professeur vous avez l'intention d'utiliser la récursivité. Sinon, il s'agit simplement de chercher la bonne formule, ce qui n'a aucun sens dans une classe de programmation.

Si la récursivité est autorisée, je vous recommande fortement de lire le tutoriel this (en supposant que vous ne le sachiez pas).

4

http://mathworld.wolfram.com/BinetsFibonacciNumberFormula.html

que vous pouvez copier ici

http://cboard.cprogramming.com/cplusplus-programming/108426-binets-formula.html

long double f(short N) { 
    double phi = (1+pow(5,0.5))/2; 
    return ceil((pow(phi,N) - pow(1-phi,N))/pow(5,0.5)); 
} 

bien sûr, il est juste en mathématiques, mais il ne calcule fib (N) sans récursivité et des boucles .. vous avez encore besoin un moyen d'imprimer toutes les valeurs pour fib (1) .. fib (n) si

ce que votre enseignant veut est probablement récursion.

+2

cet arrêt de solution à partir de petits nombres de fibonacci parce que les variables de point FLOTING n'avez pas une bonne précision. Et cette solution est la solution MPC de résoudre la récurrence normale. – Svisstack

+2

Les entiers n'ont pas non plus de précision arbitraire, au moins en C. Je voulais juste souligner que la fonction ne nécessite pas de récursion/per se/ –

+1

@Svisstack - ce n'est pas un problème - il suffit d'écrire 256 peu (ou si) bibliothèque à virgule flottante et vous êtes prêt à partir. – Hogan

7

Si les boucles et la récursivité ne sont pas permises, ramasser la définition de la séquence fibonacci et le faire à la main ... c'est ridiculement ennuyeux et inintéressant mais c'est la solution la plus simple dans ces restrictions.

a = 0; // 0 
b = 1; // 1 
a = a + b; // 1 
b = a + b; // 2 
a = a + b; // 3 
b = a + b; // 5 

et ainsi de suite: b contient le nième et un le (n-1) -ième nombre. (Copier-coller a = a+b; b = a+b; combien de fois vous avez besoin ...) Copier-coller des fragments de code est autorisé?

... (modifier) ...

Bien sûr, cette réponse montre à quel point les étoffes ridicolous peut obtenir si l'on met trop rescrictions. Si vous ne connaissez pas la récursivité, vous devez l'apprendre, définitivement.Ou s'en tenir aux mathématiques fines (comme d'autres réponses), mais la récursivité est un outil puissant que les programmeurs devraient savoir de toute façon, et l'approche récursive est plus intuitive que l'utilisation de «trucs» mathématiques.

+6

LAME ... et nous ne voulons probablement pas donner à rob2k8 même une idée de ce que ce genre de chose est encore acceptable à distance. – CheesePls

+0

Ouais, ce n'est pas ... c'est juste la conséquence extrême d'interdire les boucles et les récursions (puisqu'il ne le sait pas, donc la réponse montre clairement à quel point ça serait bête sans même la récursivité!). La réponse est ironiquement hilarante, et je suis désolé d'avoir été forcé de l'écrire explicitement; Je pensais que mon dernier "copier-coller des fragments de code est autorisé?" aurait suffi pour comprendre que la réponse ne doit pas être prise au sérieux, comme vous (et votre commentaire upvoter) a fait. – ShinTakezou

+0

... des détails supplémentaires, juste au cas où l'OP pourrait devenir confus et penser que la solution est acceptable. – ShinTakezou

4

Depuis boucle et récursion ne sont pas autorisés,

int fib(int n) { 
    int fk1 = 0, fk0 = 1; 
main_sub3: 
    fk1 += fk0; 
    fk0 = fk1 - fk0; 
    if (n > 0) { 
    -- n; 
    goto main_sub3; 

* raptor *

+10

N'est-ce pas une boucle? – izb

+5

+1 Pour les Raptors: P –

+1

ewwww goto. Mais, il y a des rapaces. – CheesePls

21

En supposant que vous utilisez des entiers non signés 32 bits, le nombre 48e de Fibonacci provoquera un débordement d'entier. Cela rend parfaitement faisable d'utiliser une table de recherche avec toutes les valeurs précalculées (à la main).

+2

+1 pour une autre solution (seulement dit dans le commentaire). Montrer un code possible serait intéressant pour souligner comment la solution récursive, même si la récursivité peut lui sembler étrangère, est la plus courte et la plus intuitive. ... (au lieu de calc à la main, il pourrait utiliser [this] (http://81.167.229.63/~srbzorg/fibonaccigenerator.php) le lien vient de wikipedia) – ShinTakezou

+0

+1 pour souligner l'incroyable finitude du problème et donc la solution optimale. Une table de 192 octets est probablement encore plus petite que le code ...sans parler de beaucoup plus vite. –

+0

@R: oui, et si des nombres entiers de 64 bits sont utilisés, il n'y a toujours que 94 nombres avant que vous n'arriviez à déborder. – JeremyP

Questions connexes