IPB
ЛогинПароль:

> Прочтите прежде чем задавать вопрос!

1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...
2. Все тексты программ должны помещаться в теги [code=pas] ... [/code].
3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM!
6. Одна тема - один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме!!!
8. Спрашивайте и отвечайте четко и по существу!!!

 
 Ответить  Открыть новую тему 
> Рекурсия, Вычисление интеграла методом прямоугольников
Pharaon
сообщение 22.03.2008 15:47
Сообщение #1





Группа: Пользователи
Сообщений: 2
Пол: Мужской
Реальное имя: Андрей

Репутация: -  0  +


В университете задали решить эту простую задачу (с погрешностью 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.

Сообщение отредактировано: Pharaon - 22.03.2008 15:48
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
volvo
сообщение 22.03.2008 17:00
Сообщение #2


Гость






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

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 17:02
Сообщение #3





Группа: Пользователи
Сообщений: 2
Пол: Мужской
Реальное имя: Андрей

Репутация: -  0  +


Так нас учат smile.gif Спасибо за помощь!
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 



- Текстовая версия 20.07.2025 6:45
Хостинг предоставлен компанией "Веб Сервис Центр" при поддержке компании "ДокЛаб"