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 члена досчитать ( если не состаришься раньше |
|
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
|
|