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

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

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

> Вычислить сумму ряда с заданной точностью с помощью рекурсии, Рекурсия
сообщение
Сообщение #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 
 К началу страницы 
+ Ответить 
 
 Ответить  Открыть новую тему 
Ответов
сообщение
Сообщение #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 -
 К началу страницы 
+ Ответить 

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


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

 





- Текстовая версия 5.09.2025 11:51
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name