Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум «Всё о Паскале» _ Задачи _ Рекурсия

Автор: Pharaon 22.03.2008 19:47

В университете задали решить эту простую задачу (с погрешностью 0.001 вычислить интеграл от 0 до 1 sin(x)/x*dx) с помощью рекурсии. Задача без рекурсии решается элементарно, но вот с ней у меня проблемы. Программу написал, при запуске выдаёт какую-то ошибку. Надеюсь на вашу помощь.
p.s. Программа из методички БЕЗ рекурсии:
program Method_Prm;
const
e = 0.001;
var
i, n: word;
a, b, j1, j2, h, s, x: real;
begin
writeln(‘Введите пределы интегрирования a и b’);
readln(a, b);
n:= 2;
j1:= 0;
repeat
j2:= j1;
h:= (b - a)/n;
x:= a; s:= 0;
for i:= 1 to n do begin
s:= s + sin(x)/x;
x:= x + h
end;
j1:= s*h;
n:= n*2
until abs(j1 - j2);
writeln(‘Интеграл = ’, j1)
end.
Неработающая, составленная мной программа:
program lab_4_2;
const e=0.001;
var a,b,j1,j2,s:real;
function int(a,b:real; n:word):real;
var h,x:real; i:byte;
begin
j2:=j1;
h:=(b-a)/n; x:=a;
for i:=1 to n do begin
s:=s+sin(x)/x;
x:=x+h end;
j1:=s*h;
if abs(j1-j2)<e then int:=j1
else int:=int(a,b,n*2)
end;
begin
writeln(int(0,1,2));
readln
end.

Автор: volvo 22.03.2008 21:00

Хм... В принципе, решение несложное, и оно почти было найдено тобой:

function integral(prev, a, b: real; n: integer): real;
var
x, h, s: real;
i: integer;
begin
h := (b - a) / n;
x := a; s := 0;
for i := 1 to n do begin
s := s + sin(x) / x;
x := x + h;
end;

if abs(s * h - prev) > 0.001 then
integral := integral(s * h, a, b, 2 * n)
else
integral := s * h;
end;

begin
writeln(integral(0, 1, 2, 2)); { на интервале 1 .. 2, потому как при X = 0 будет деление на 0 }
readln
end.

Но... Возникает только один вопрос: "А зачем здесь рекурсия?"

Автор: Pharaon 22.03.2008 21:02

Так нас учат smile.gif Спасибо за помощь!