Рекурсивный Фибоначчи - PullRequest
       25

Рекурсивный Фибоначчи

35 голосов
/ 05 октября 2009

Мне трудно понять, почему

#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;
}

приводит к ошибке сегментации. Как только x падает до 1, разве он не должен возвращаться?

Ответы [ 13 ]

150 голосов
/ 05 октября 2009

Когда x==2 вы звоните fib(1) и fib(0):

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

Подумайте, что произойдет, когда fib(0) будет оценено ...

40 голосов
/ 05 октября 2009

Причина в том, что последовательность Фибоначчи начинается с двух известных объектов, 0 и 1. Ваш код проверяет только один из них (будучи одним).

Измените свой код на

int fib(int x) {
    if (x == 0)
        return 0;

    if (x == 1)
        return 1;

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

Чтобы включить 0 и 1.

11 голосов
/ 05 октября 2009

Почему бы не использовать итерационный алгоритм?

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;
}
7 голосов
/ 12 августа 2014

По определению, первые два числа в последовательности Фибоначчи - это 1 и 1 или 0 и 1. Поэтому вы должны обработать это.

#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));
}
3 голосов
/ 15 марта 2016

Это моё решение проблемы Фибоначчи с рекурсией.

#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;
}
3 голосов
/ 07 июля 2012

Я думаю, что это решение короткое и выглядит красиво:

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

Редактировать: как упоминал jweyrich, истинная рекурсивная функция должна быть:

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

(потому что fib (0) = 0. но исходя из приведенной выше рекурсивной формулы, fib (0) будет 1)

Чтобы понять алгоритм рекурсии, вы должны нарисовать на бумаге, и самое главное: «Думай нормально, как часто».

2 голосов
/ 03 марта 2013
int fib(int n) {
    if (n == 1 || n == 2) {
        return 1;
    } else {
        return fib(n - 1) + fib(n - 2);
    }
}

в последовательности Фибоначчи первые 2 числа всегда равны 1, затем каждый раз, когда значение становится 1 или 2, оно должно возвращать 1

1 голос
/ 10 декабря 2013
if(n==1 || n==0){
    return n;
}else{     
    return fib(n-1) + fib(n-2);
}

Однако использование рекурсии для получения числа Фибоначчи является плохой практикой, потому что функция вызывается примерно в 8,5 раз больше, чем полученное число. Например. чтобы получить число Фибоначчи от 30 (1346269) - функция вызывается 7049122 раза!

1 голос
/ 17 сентября 2013
int fib(int x) 
{
    if (x < 2)
      return x;
    else 
      return (fib(x - 1) + fib(x - 2));
}
1 голос
/ 29 апреля 2013
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));
}
...