una serie recursividad recursivas recursiva recibe que programacion números número los imprime función funciones funcion consideremos con ats algoritmo c++ recursion fibonacci

c++ - recursividad - serie de fibonacci algoritmo



Fibonacci recursivo (12)

Me está costando entender por qué

#include <iostream> using namespace std; int fib(int x) { if (x == 1) { return 1; } else { return fib(x-1)+fib(x-2); } } int main() { cout << fib(5) << endl; }

da como resultado una falla de segmentación. Una vez que x llega a 1, ¿no debería eventualmente regresar?


¿Por qué no usar el algoritmo iterativo?

int fib(int n) { int a = 1, b = 1; for (int i = 3; i <= n; i++) { int c = a + b; a = b; b = c; } return b; }


Creo que es la mejor solución de fibonacci que usa recursividad.

#include<bits/stdc++.h> typedef unsigned long long ull; typedef long long ll; ull FIBO[100005]; using namespace std; ull fibo(ull n) { if(n==1||n==0) return n; if(FIBO[n]!=0) return FIBO[n]; FIBO[n] = (fibo(n-1)+fibo(n-2)); return FIBO[n]; } int main() { for(long long i =34;i<=60;i++) cout<<fibo(i)<<" " ; return 0; }


Creo que esta solución es corta y parece bonita:

long long fib(int n){ return n<=2?1:fib(n-1)+fib(n-2); }

Editar: como mencionó jweyrich, la verdadera función recursiva debería ser:

long long fib(int n){ return n<2?n:fib(n-1)+fib(n-2); }

(porque fib (0) = 0. pero base en la fórmula recursiva anterior, fib (0) será 1)

Para entender el algoritmo de recursión, debe dibujar en su papel, y lo más importante es: "Piense normal como a menudo".


Cuando x==2 llamas fib(1) y fib(0) :

return fib(2-1)+fib(2-2);

Considere lo que sucederá cuando se evalúe fib(0) ...


La razón es porque la secuencia de Fibonacci comienza con dos entidades conocidas, 0 y 1. Su código solo verifica uno de ellos (siendo uno).

Cambia tu código a

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

Para incluir tanto 0 como 1.


Mi solución es:

#include <iostream> int fib(int number); void call_fib(void); int main() { call_fib(); return 0; } void call_fib(void) { int input; std::cout<<"enter a number/t"; std::cin>> input; if (input <0) { input=0; std::cout<<"that is not a valid input/n" ; call_fib(); } else { std::cout<<"the "<<input <<"th fibonacci number is "<<fib(input); } } int fib(int x) { if (x==0){return 0;} else if (x==2 || x==1) { return 1; } else if (x>0) { return fib(x-1)+fib(x-2); } else return -1; }

devuelve fib (0) = 0 y error si es negitive


Por definición, los primeros dos números en la secuencia de Fibonacci son 1 y 1, o 0 y 1. Por lo tanto, debe manejarlo.

#include <iostream> using namespace std; int Fibonacci(int); int main(void) { int number; cout << "Please enter a positive integer: "; cin >> number; if (number < 0) cout << "That is not a positive integer./n"; else cout << number << " Fibonacci is: " << Fibonacci(number) << endl; } int Fibonacci(int x) { if (x < 2){ return x; } return (Fibonacci (x - 1) + Fibonacci (x - 2)); }


Esta es mi solución al problema de fibonacci con recursión.

#include <iostream> using namespace std; int fibonacci(int n){ if(n<=0) return 0; else if(n==1 || n==2) return 1; else return (fibonacci(n-1)+fibonacci(n-2)); } int main() { cout << fibonacci(8); return 0; }


if(n==1 || n==0){ return n; }else{ return fib(n-1) + fib(n-2); }

Sin embargo, usar recursión para obtener el número de fibonacci es una mala práctica, porque la función se llama aproximadamente 8,5 veces más que el número recibido. Por ejemplo, para obtener el número de fibonacci de 30 (1346269) - ¡la función se llama 7049122 veces!


int fib(int n) { if (n == 1 || n == 2) { return 1; } else { return fib(n - 1) + fib(n - 2); } }

en la secuencia de Fibonacci, los primeros 2 números siempre se siguen hasta 1, entonces cada vez que el valor se vuelve 1 o 2, debe regresar 1


int fib(int x) { if (x < 2) return x; else return (fib(x - 1) + fib(x - 2)); }


int fib(int x) { if (x == 0) return 0; else if (x == 1 || x == 2) return 1; else return (fib(x - 1) + fib(x - 2)); }