2014-02-14 3 views
-1

Я только начал изучать C++ самостоятельно. Сейчас я пытаюсь попрактиковаться. Я хочу напечатать все номера фибоначчи n (ввод пользователем) с помощью рекурсии, но это не сработает. Не могли бы вы помочь мне? Спасибо!!печать серии фибоначчи с использованием рекурсии в C++

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

Что вы ожидаете от кода после 'return'? –

+7

Код * после * возврат ** не будет выполняться **. В конце концов, вы * вернулись * к вызывающей функции. – crashmstr

+1

вы хотите получить результат, так: 'cout << fibonacci (n);' – marcinj

ответ

3

Если вы посмотрите на Rosetta Code page for Fibonacci, вы увидите, что F(0) == 0 и F(1) == 1.

int fibonacci(int n) 
{ 

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

    return fib; 
} 

В этом случае у вас есть функция, которая будет вычислять число фибоначчи в определенной позиции, верно?

Так что теперь вам нужно вычислить их, а затем распечатать их:

int main() 
{ 
    int n; 
    cin >> n; 

    if (n < 0) 
    { 
     return -1; // This means there was an error 
    } 

    for (int i = 1; i < n; ++i) 
    { 
     cout << fibonacci(i) << " "; 
    } 

    return 0; 
} 

Обратите внимание, что это не самый эффективный способ сделать это на всех, но это своего рода поможет вам понять, как рекуррентные работает.

+0

И затем вы можете искать то, что означает memoization. – MatthieuW

+0

Ну, [memoization] (http://en.wikipedia.org/wiki/Memoization) действительно просто причудливый способ сказать: «Не вычисляйте одно и то же дважды». –

2

Даже если вы поместите cout до вашего возвращения заявления, ваш код не даст вам ряд Фибоначчи в правильном порядке. Допустим, вы просите fibonacci(7). Он распечатает все промежуточные вычисления для fibonacci(6), а затем распечатает все 1 для fibonacci(5).

+1

Это еще сложнее, так как линии «cout» также вызывают рекурсию. – MatthieuW

2

Нет необходимости соиЬ в функции Фибоначчи, только соиЬ петлей в междунар основной() ... также изменение IF условие в функции Фибоначчи к < = 0 в противном случае это даст вам ошибку сегментации (ошибка)

#include <iostream> 
using namespace std; 
int fibonacci(int n) 
{ 
    if (n<=0) 
    { 
     return 0; 
    // cout<<1<<" "; 
    } 
    else if (n==1) 
    { 
     return 1; 
    // cout<<1<<" "; 
    } 
    else 
    { 
     return (fibonacci(n-1)+fibonacci(n-2)); 
    // cout<<fibonacci(n-1)+fibonacci(n-2)<<" "; 
    } 
} 
int main() 
{ 
    int n; 
    cin>>n; 
    for (int x = 0; x < n; x++) 
    cout << fibonacci(x) << " "; 
    cout << endl; 

    return 0; 
} 
+0

n <= 0 необходимо, потому что он возвращает в противном случае -1 + -2 = -3, который вызывает ошибку сегментации ... – Shaan

+0

также u r вызывает cout после возврата ... поэтому он не будет выполняться b – Shaan

Смежные вопросы