2012-02-09 2 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

Затем найдите способ, специфичный для компилятора, для увеличения размера стека и исключения переполнения стека catch, чтобы предоставить пользователю значимое сообщение. Например. для размера стека по умолчанию для Visual C++ составляет всего 1 Мб (см. здесь: http://msdn.microsoft.com/en-us/library/tdkhxaks(v=vs.71).aspx). Для ваших номеров я бы предложил начать с нескольких сотен мегабайт (так как вы хотите иметь 2 миллиона вызовов в стеке) –

+0

@ahmadalishafiee: Эта проблема также может быть решена в цикле, вместо использования рекурсии. Тогда размер стека вызовов не вызывает беспокойства. –

1

Вы пытались ввести некоторые отрицательные числа? Вы не делать какие-либо проверки на входы, которые Вы передаете в вашей программе, и в

return fib[i]; 

вы получите сообщение об ошибке, если вы пытаетесь получить доступ к несуществующим адресам.

+0

Я редактирую свой код и добавляю некоторые отрицательные номера, но я не видел никаких изменений в исключениях! –

+1

Может возникнуть ошибка или может не произойти ошибка. –

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