2016-03-21 11 views
0

フィボナッチシーケンスを解くために次のコードを思いついた。 私の主な質問は、どうしてですか返信正しい値ですか? a==1の結果を返すような行を追加した場合は、正しい戻り値を得ることが分かりますが、そのままでは解決できません。 これ以上の通常の再帰アルゴリズムを使用することに利点があるかどうかも知りたいですか?Cのフィボナッチアルゴリズム - なぜこれが戻り値として機能しますか?

int calculate(int a,int result,int old) 
{ 

    if (a>0) 
    { 
     printf("%d ",result); 
     return calculate (a-1,result+old,result); 
    } 

} 

int main() 
{ 
    int number,choice; 
    printf("To start from 0 enter 0. To start from one enter any other number.\n"); 
    scanf("%d",&choice); 
    printf ("Choose the number of times you wish to go for.\n"); 
    scanf("%d",&number); 
    if (choice==0) 
    { 
     printf("Result= %d",calculate(number,0,1)); 
     return 0; 
    } 
    printf("Result= %d",calculate(number,1,0)); 

    return 0; 

} 
+1

'calculate'は常に値を返すわけではないので、コードの形式が正しくありません。 'return 0;'または 'a'が0または負である場合に対処するものが必要です。 –

+2

あなたは何かを返すことを忘れた 'a == 0 'の場合、どうやって魔法のように動くのでしょうか?あなたは何を返すべきかを教えてくれなかったので、ランダムなものが返されました(これは*未定義の振る舞い*です)。しかし、幸運(または実際には不運)によって、あなたが望むものが返されました。明らかに、あなたはそれに頼りたくはありません。良いコンパイラがこれについてあなたに警告します。 –

+1

少なくとも、適切なコンパイラは、計算機能に関する警告を生成しませんでしたか?すべてのコードパスではなく、値を返す行に沿っていますか? – Skizz

答えて

0

このケースでは値を受け取って返すことをお勧めします。

/*Recursive fibonacci function*/ 
#include <stdio.h> 

long fibonacci(int); 

int main() 
{ 

    long result; 
    int number; 

    printf("Enter an interger: "); 
    scanf("%d", &number); 
    result = fibonacci(number); 
    printf("Fibonacci(%d) = %ld\n", number, result); 

    getchar(); 
    return 0; 


} 

//Recursive definition of function fibonacci 
long fibonacci(int n) 
{ 
    if(n == 0 || n == 1) 
     return ((long) n); 
    else 
     return fibonacci(n - 1) + fibonacci(n - 2); 
} 

再帰的な方法は素晴らしいですが、それは多くのメモリを消費し、反復オプションはフィボナッチ数列を解決するためにとても非効率です:次のようにコードを簡素化することができます。

"c/C++"に基づいています。 Deitel & Deitel

関連する問題