Форум «Всё о Паскале» _ Теоретические вопросы _ Stack Overflow Error
Автор: Unconnected 15.01.2009 1:32
function y(i:byte):real; begin y:=(y(i-1)+1)/(y(i-1)+2); end;
var i:byte; begin repeat inc(i); until (y(i)-y(i-1))<0.00001; writeln('Iskomoe chislo - ',i); readln; end.
Этот код компилируется с ошибкой Stack Overflow Error. TP7. Задание в оригинале:
Цитата
2...Пусть Y(0)=0; Y(i)=(Y(i-1)+1)/(Y(i-1)+2), i=1,2,3,... Найти первый член Y(n), для которого Y(n)-Y(n-1)<0.00001.
Автор: volvo 15.01.2009 1:54
Цитата
Этот код компилируется с ошибкой Stack Overflow Error.
Не так. Компилируется-то этот код нормально, а вот при запуске программы - вылет с указанной ошибкой... А все почему? Потому, что у тебя там рекурсия бесконечная. Где условие выхода из рекурсии? У тебя ж в задании написано, что Y(0) = 0, почему ты это не сказал своей фунции?
Добавлено через 1 мин. P.S. На всякий случай: не забудь присвоить значение переменной I, перед тем, как ее использовать.
Автор: Unconnected 15.01.2009 2:11
Цитата
Где условие выхода из рекурсии? У тебя ж в задании написано, что Y(0) = 0, почему ты это не сказал своей фунции?
Немного тупой вопрос...А как это нужно было сказать? Как я понимаю, условие выхода из рекурсии -
until (y(i)-y(i-1))<0.00001;
, разве не так?
Автор: volvo 15.01.2009 2:17
Нет-нет... У тебя прежде, чем выполнение дойдет до разности и сравнения ее с погрешностью, надо чтобы закончилась работа функции, да? Вот у тебя этого не происходит... Попробуй:
function y(i:byte):real; begin if i = 0 then y := 0 { <--- Вот оно, условие выхода } else y:=(y(i-1)+1)/(y(i-1)+2); end;