2012-02-09 27 views
-3

私はgppとmicrosoftコンパイラの両方を使ってこのコードを実行しますが、どちらの場合でも例外があります。 しかし、私はその理由を理解できません! これは私のコードです:なぜstd :: mapが例外をスローしますか?

#include <iostream> 
#include <map> 

using namespace std; 

map<int,int> fib; 

int fibo(int i) 
{ 
    if (!fib.count(i)) 
    { 
     fib.insert(pair<int, int>(i,fibo(i-1)+fibo(i-2))); 
    } 

    return fib[i]; 
} 

int r(int i) 
{ 
    if(i<3) 
    { 
     return i; 
    } 
    else 
    { 
     return fibo(i)+r(i-2); 
    } 
} 

int main() 
{ 


    fib.insert(pair<int, int>(0,1)); 
    fib.insert(pair<int, int>(1,1)); 

    int a,b,n; 
    cin>>a>>b; 

    n=b-a; 

    int fiba=fibo(a); 
    int fibaa=fibo(a-1); 

    cout << (r(n+1)*fiba)+(r(n)*fibaa); 

    return 0; 
} 

誰でも助けてくれますか?

このコードをデバッグしたところ、fib.insert(pair<int, int>(i,fibo(i-1)+fibo(i-2)));は機能しません。

+1

例外とはどこですか? – Fox32

+1

デバッグしようとしませんでしたか? – vulkanino

+1

入力は? –

答えて

1

コードを実行したときにスタックオーバーフロー例外が発生しました。明らかに再帰が深すぎるためです。 スタックサイズを増やすか(後で大きい数字を入力して再度同じ例外を得ることもできます)、またはこのアルゴリズムを非再帰的なアルゴリズムに変換する必要があります(例:http://www.codeproject.com/Tips/109443/Fibonacci-Recursive-and-Non-Recursive-C)。

+0

しかし、私はダイナミックプログラミングアルゴリズムでフィボナッチを欲しいです! –

+0

次に、スタックサイズを増やし、スタックオーバーフロー例外をキャッチして意味のあるメッセージをユーザーに提供するコンパイラ固有の方法を探します。例えば。 Visual C++のデフォルトスタックサイズは1Mbです(http://msdn.microsoft.com/en-us/library/tdkhxaks(v=vs.71).aspxを参照)。あなたの数値については、数百メガバイトから始めることをお勧めします(スタックで2 mlnの呼び出しを望みます) –

+0

@ahmadalishafiee:この問題は、再帰を使用する代わりにループで解決することもできます。その後、コールスタックのサイズは問題になりません。 –

1

いくつかの負の数を入力しようとしましたか?あなたは、あなたのプログラムに渡す入力上の任意のチェックをしないと、あなたは存在しない場所にアクセスしようとした場合

return fib[i]; 

にエラーが発生します。

+0

私は自分のコードを編集し、いくつかの負の数を追加しますが、私は例外に何の変化も見ませんでした! –

+1

エラーが発生する場合と発生しない場合があります。 –

関連する問題