2016-09-05 10 views
-5

私は演習としてファボナッチ数を計算するための簡単なコードを書いています。コードは機能しますが、私は理由を知りません。私はn=1n=2のいくつかの特別なケースを持っています。これはシーケンスの番号の場所です(数字は0と1です)。しかし、それらの後に、このループで数が計算されます。私のコードはなぜ機能しますか?単純な算術

while(n>LoopCount) 
{ 

    Fib_n=Fib_1+Fib_2; 

    Fib_2=Fib_1; 

    Fib_1=Fib_n; 

    LoopCount++; 
} 

Fib_2=0、ループ、Fib_1=0に行く、とFib_n=1。なぜ、このループはちょっと吐き出されないのですか?0コード全体は以下の通りです。

#include <iostream> 

using namespace std; 

int main() 
{ 
    cout <<"Which number of the Fibonacci sequence do you want to calculate?" <<endl; 

    int n; 
    cin >>n; 
    cout <<endl; 

    int Fib_n; 
    int Fib_1; 
    int Fib_2; 
    int LoopCount=1; 

    if(n>1) 
    { 
     Fib_n=1; 
     LoopCount++; 

     while(n>LoopCount) 
     { 

      Fib_n=Fib_1+Fib_2; 

      Fib_2=Fib_1; 

      Fib_1=Fib_n; 

      LoopCount++; 
     } 
    } 

    cout <<Fib_n; 

    return 0; 
} 
+5

このような問題を解決する適切なツールは、デバッガです。スタックオーバーフローを尋ねる前に、コードを一行ずつ進める必要があります。詳しいヘルプは、[小さなプログラムをデバッグする方法(Eric Lippert)](https://ericlippert.com/2014/03/05/how-to-debug-small-programs/)を参照してください。最低限、問題を再現する[最小、完全、および検証可能](http://stackoverflow.com/help/mcve)の例と、その問題を再現するためのデバッガ。 –

+0

初期化されていない変数を使用すると、プログラムによって[未定義の動作](http://stackoverflow.com/a/4105123/1505939)が発生します。 'Fib_1'と' Fib_2'( 'if'の外側で' Fib_n')の初期値を設定してください。 –

+0

@AndrewL。彼は '0 + 0'を計算するために' 0'を得なかった理由を尋ねています –

答えて

1
int Fib_1; 
int Fib_2; 

が初期化されませんでした。したがって、初めてFib_n=Fib_1+Fib_2;を計算すると、Fib_nは2つの未初期化変数の合計を取得します。

私はあなたのコードが変更されたので動作します。

#include <iostream> 

using namespace std; 

int main() 
{ 
    cout <<"Which number of the Fibonacci sequence do you want to calculate?" <<endl; 

    int n; 
    cin >> n; 
    cout << endl; 

    int Fib_1 = 1; 
    int Fib_2 = 1; 

    int count = 0; 

    while(n > count) 
    { 
     Fib_1 = Fib_1 + Fib_2; 
     Fib_2 = Fib_1 - Fib_2; 
     count++; 
    } 

    cout << Fib_1; 
    return 0; 
} 
0
Fib_1 

あなたはuninitalized変数として、あなたは、出力のためのごみ値を取得することがあります。

Fib_2 = Fib_1 

次に、あなたは彼らが同じ(ランダム)値を共有し、両方の意味、Fib_1Fib_2を初期化します。デバッグモードで

、これらは両方とも0に初期化し、それらを追加している:

Fib_n=Fib_1+Fib_2; 

はリリースモードでは0に等しい合計は、あなたがコンパイラからランダムな値を期待することができます。 Uninitialized Variablesの詳細はこちらです。

関連する問題