1. Заголовок темы должен быть информативным. В противном случае тема удаляется ... 2. Все тексты программ должны помещаться в теги [code=pas] ... [/code], либо быть опубликованы на нашем PasteBin в режиме вечного хранения. 3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали! 4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора). 5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM! 6. Одна тема - один вопрос (задача) 7.Проверяйте программы перед тем, как разместить их на форуме!!! 8.Спрашивайте и отвечайте четко и по существу!!!
Вычислить сумму ряда с заданной точностью с помощью рекурсии, Рекурсия
Вычислить сумму ряда с заданной точностью e(epsilon)>0
Есть решение, нет уверенности, что правильно:
PROGRAM PRP6; var e, res, a, b : REAL;
FUNCTION comp(x, y, e: REAL):real;{функция нахождения суммы} var w, z, sum: real; BEGIN w:=x; z:=y; sum:=1/(w*z); IF 1/(w*z) >= e then BEGIN sum:=comp(x, y, e); w:=w+4; z:=z+4; END else comp:=sum;
убрал свои модификации, оставил как сделал volvo с подсчетом итераций, и eps сделал глобальной. Вот как выглядит функция
function f(x:integer):real; begin inc(i); if 1/(1.0* x * (x+2)) < eps then f := 0 else f := (1/(x * (x+2))) + f(x + 4); end;
и обработчик кнопки
procedure TForm2.Button1Click(Sender: TObject); var r:real; k:byte; begin eps:=1E-1; Memo1.Clear; for k := 1 to 10 do begin i:=0; r:=f(3); Memo1.Lines.Add(inttostr(k)+ ') ' +FloatToStr®); Memo1.Lines.Add('Кол-во итераций: ' + inttostr(i)+ ' eps= '+FloatToStr(eps)); Memo1.Lines.Add(' '); eps:=eps/10; end; end;
Моя ошибка была в добалении переменной и результат был не правильным. Но хотя если заменить выражение переменной, измений быть не должно. Видимо при возвращении функции результата вместо бывшей x1 подставлялось самое последнее значение вместо текущего (т.е. на каждой итерации свое значение)? (в этой стоке)
else f:=x1 + f(x+4);
Хм, на Delphi вроде работает. Теперь паскаль
uses crt; var x1:real; i,k:integer; eps:real;
function f(x:integer):real;
begin inc(i); if 1/(1.0 * x * (x+2)) < eps then f := 0 else f := (1/(1.0 * x * (x+2))) + f(x + 4); end;
begin clrscr; i:=0; eps:=1E-1; for k:=1 to 7 do begin i:=0; writeln(f(3):0:7, ' ',i); eps:=eps/10; end; readkey end.
Выдает такие же значения (до 1Е-7, потом стек переполняется).