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

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

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

> Вычислить сумму ряда с заданной точностью с помощью рекурсии, Рекурсия
dog
сообщение 2.02.2010 21:46
Сообщение #1


Новичок
*

Группа: Пользователи
Сообщений: 17
Пол: Женский

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


Прикрепленное изображение

Вычислить сумму ряда с заданной точностью 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;

END;

BEGIN
WRITELN('Введите точность e');
READLN(e);
a:=3;
b:=5;
res:=comp(a, b, e);
WRITELN('Сумма ряда', res:5:2);
END.



Просьба проверить и поправить, если что неправильно
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
 
 Ответить  Открыть новую тему 
Ответов
volvo
сообщение 3.02.2010 0:52
Сообщение #2


Гость






Цитата
Ну на самом деле сложная задача, ряды да еще и рекурсия.
На самом деле рекурсия - проще, чем итерация. Если понимаешь сам принцип написания рекурсивных функций. Не веришь? Смотри:

1. Для начала определимся с тем, что наша рекурсия будет принимать, и что - возвращать... Ну, возвращать она будет Real, это очевидно. А принимать - 2 числа которые стоят в знаменателе, так? Не совсем. Зачем передавать их оба, если можно передать одно, только X, а зная X вычислять Y когда нужно?. Итак, с заголовком определились:
function f(X: integer; eps: real): real;


2. Теперь делаем то, без чего работающей рекурсивной функции не может существовать - опишем условие выхода из функции. Когда надо выходить? Правильно, если 1/(x * (x+2)) станет меньше eps... Так и запишем... Хм. А что запишем? Что должно вернуться, когда пришло время выйти из функции? Функция у нас считает сумму ряда, значит надо вернуть какое-то значение, которое эту сумму не испортит. Такое значение у нас только одно: ноль...

Вот, значит, и пишем условие выхода:
if 1/(x * (x+2)) < eps then f := 0


3. Ну хорошо, если условие выполнилось, понятно что будет. А если НЕ выполнилось - что делать? Словами описываем алгоритм: сложить значение текущего члена с суммой последующих. Так? Так... А на Паскаль перевести?
else { Не выполнилось условие }
f := (1/(x * (x+2))) + f(x + 4, eps); { сложим текущий с последующими }


Итого - собираем все вместе:
function f(X: integer; eps: real): real;
begin
if 1/(x * (x+2)) < eps then f := 0
else f := (1/(x * (x+2))) + f(x + 4, eps);
end;

Вот и все... Сложно? По-моему, нет...

НО. (опять это НО, я всегда ловлю себя на мысли, что слишком часто получаются какие-то оговорки, ничего не бывает просто и без проблем). Эта функция будет работать, но до определенного предела. Где предел, и почему функция не работает дальше (в настройках компилятора выставить все Run-time проверки !!!) - вот вопрос...

Первый, кто ответит на этот вопрос, правильно объяснит причину, и приведет способ исправления моей функции - получает +1 к рейтингу smile.gif ...

Сообщение отредактировано: volvo - 25.02.2010 14:31
 К началу страницы 
+ Ответить 

Сообщений в этой теме
dog   Вычислить сумму ряда с заданной точностью с помощью рекурсии   2.02.2010 21:46
TarasBer   Так ты сначала у себя запусти, проверь. Ты ж не пр...   2.02.2010 22:11
dog   Она при некоторых значениях епсилон выдает всегда ...   2.02.2010 23:34
TarasBer   Дык проверь сначала, чего меня спрашивать. От заме...   2.02.2010 23:53
volvo   На самом деле рекурсия - проще, чем итерация. Если...   3.02.2010 0:52
Unconnected   Наверное, проблема с максимальной точностью значен...   3.02.2010 7:43
Client   ошибка в этом месте if 1/(x * (x+2)) < eps then...   3.02.2010 15:11
volvo   Оба предыдущих ответа не содержат правильной идеи....   3.02.2010 18:46
TarasBer   > else f := (1/(x * (x+2))) + f(x + 4, eps); Т...   3.02.2010 18:46
volvo   Ничего не должно произойти, без разбиения все прек...   3.02.2010 18:52
dog   P.S. А где, собственно, топикстартер? Ей не интер...   5.02.2010 1:18
TarasBer   Тут про переполнение типа говорили. Я бы написал д...   3.02.2010 18:55
volvo   Вот от тебя (с твоей тягой к оптимизации) я это о...   3.02.2010 19:03
Client   x * (x+2)ошибка именно здесь, даже без деления. ты...   3.02.2010 19:06
TarasBer   > Вот от тебя (с твоей тягой к оптимизации) я ...   3.02.2010 19:15
dog   f := tmp_f + 1/(longint(x)*(x+2)) То есть как я...   5.02.2010 1:54
TarasBer   > Поэтому программа и вылетает? Нет, у меня пр...   6.02.2010 14:29
Client   volvo, кажется больше идей нету... тут приведение ...   7.02.2010 19:18
volvo   Приведение типов не нужно... Явное по крайней мере...   7.02.2010 23:03
Krjuger   Я думаю,что для начала надо разобраться почему выл...   7.02.2010 23:16
TarasBer   > пока никто не показал окончательный код, кото...   8.02.2010 20:42
volvo   Ответ неверный... Для 1E[color=red]-8 - вычисляетс...   11.02.2010 12:12
Client   uses crt; var x1:real; i:integer; eps:rea...   15.02.2010 16:12
Lapp   Получилось так. Терерь проблема со стеком.Client, ...   18.02.2010 14:35
Krjuger   Volvo,а разве я не высказал причину,ты бы хоть про...   17.02.2010 16:39
Client   убрал свои модификации, оставил как сделал volvo с...   18.02.2010 17:54
feniks25   если дописать uses crt,memory; этот алгоритм рас...   19.02.2010 11:15
volvo   Ложь: Кроме того: [quote name='volvo' post='1424...   19.02.2010 13:12
feniks25   Ложь: правда   19.02.2010 13:21
volvo   А я говорю - ложь... Вот мои настройки: Нечисто ...   19.02.2010 13:28
feniks25   А я говорю - ложь... Вот мои настройки: ну гово...   19.02.2010 13:39
Client   {$S-} uses crt; var x1:real; i,k:intege...   19.02.2010 14:04
feniks25   uses crt; var x1,s:real; i,k:integer; ep...   19.02.2010 15:17
TarasBer   Костыль. function f(X: longint; eps: real): real...   19.02.2010 16:37
feniks25   так что ответ можно считать правильным?   19.02.2010 17:38
volvo   Твой что-ли? Размечтался: (хотя, в принципе, може...   25.02.2010 14:44
Rian   Твой что-ли? Размечтался: Всем привет, от темы от...   1.03.2010 17:07
TarasBer   > В общем, ребята, не напрягайтесь, сортируйте ...   26.02.2010 20:24
Гость   -   4.03.2010 22:42
Jova   Цитата так что ответ можно считать правильным? Т...   4.03.2010 23:15


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

 



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