C++ Builder
| Главная | Уроки | Статьи | FAQ | Форум | Downloads | Литература | Ссылки | RXLib | Диски |

 
Числа Фибоначчи, Как вычислить рекурсивно?
BlastOff
Отправлено: 05.06.2004, 10:47


Ученик-кочегар

Группа: Участник
Сообщений: 8



Вот не получается вычислить I-тый член ряда Фибоначчи. То есть получается, но примерно до 20. А дальше стека не хватает. А надо чтобы прога считала хотя бы до 1000. Пусть и долго.
klen
Отправлено: 05.06.2004, 20:06


Машинист паровоза

Группа: Участник
Сообщений: 239



В силу особенностей проф. деятельности использование стека вообще считаю большим злом (в моем деле стека у процессоров(аппаратного) хватит на несколько вложенных функций всего хватит).

Поэтому рекомендую просто не использовать рекурсию чтоб стек не переполнять.

Если рекурсия принципиально необходима (таких случаев сам не встречал), то рекомендуя просто увеличить размер секции стека. Линковщик это отразит в заголовках бинарника в виде записи, а загрузчик процесса выделит под стек заданный обьем памяти. Для этого надо лезть в Project -> Options -> Linker -> PE file option -> Max stack size. Я когда эксперементировал, обнаружил определенный предел увеличения размера стека. Если больше нада — ручками править PE заголовки относительно стека надо.

Отредактировано klen — 05/06/2004, 21:09
Георгий
Отправлено: 05.06.2004, 20:36


Почетный железнодорожник

Группа: Модератор
Сообщений: 874



нехватает не стека, а разрядности — 20й элемент равен 1,18667703531283E3295, а следующий будет ещё, почти в квадрат раз больше

попробуй найти библиотеки для вычислений с произвольной разрядностью — с ними сможешь и до 1 000 000 члена досчитать ( если не состаришься раньше smile.gif
klen
Отправлено: 05.06.2004, 21:13


Машинист паровоза

Группа: Участник
Сообщений: 239



А ведь точно! стек тут не причем.
exp
Отправлено: 06.06.2004, 01:13


Мастер участка

Группа: Участник
Сообщений: 304



Функция ~такая
[CODE]
/*Veryveryvery*/ long Fibonachi (int &N, long Previous, long PrePrevious)
{
if(N != 1)
{
N--;
Fibonachi(N, Previous+PrePrevious, Previous);
}
return;
}

Отредактировано exp — 06/06/2004, 02:24
Георгий
Отправлено: 06.06.2004, 12:50


Почетный железнодорожник

Группа: Модератор
Сообщений: 874



QUOTE
Fibonachi(N, Previous+PrePrevious, Previous);

а мне казалось, что фибоначи — это произведение 2х предыдущих.
тогда извините — стека по умолчанию хватает для рассчёта до тысячного элемента.
CODE
void fib(const long double n1, const long double n2, const int level = 0)
       {
       const int max_level = 1000;

       if ( level > max_level ) return;

       const long double next = n1 + n2;

       AnsiString str;
       str.printf(" %5i : %Lf ", level, next );
       Form1->Memo1->Lines->Add( str );

       fib( n2, next, level+1 );
       };
exp
Отправлено: 06.06.2004, 15:26


Мастер участка

Группа: Участник
Сообщений: 304



Не-а, сумма.
Числа Фибоначи задаются начальными условиями x1=1; x2=1 и рекурентным соотношением x[i]=x[i-1]+x[i-2]

Отредактировано exp — 06/06/2004, 16:30

Вернуться в Вопросы программирования в C++Builder