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


Профи
****

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

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


uses crt;
var
x1:real;
i:integer;
eps:real;

function f(x:integer):real;
begin
inc(i);
x1:=1.0/(x*(x+2.0)); //это и есть неявное приведение типов?
if x1 < eps then f:=0
else f:=x1 + f(x+4);
end;

begin
clrscr;
i:=0;
eps:=0.0000001;
writeln(f(3):0:7);
writeln(i);
readkey
end.
Получилось так. Терерь проблема со стеком. Убрал описание eps из функции в надажде что будет экономиться место (ведь с каждым вхождением для нее выделяется память в стеке?) и добавил счетчик (для тестирования smile.gif) Для 1E-8 происходит переполнение стека. Для 1E-7 работает, вычисляет за 791 итерацию smile.gif

Добавлено через 7 мин.
хм, 16кб за 1321 итерацию...
1321 раз выделяется память для самой функции (real - 6 байт) и лок. переменной x (integer - 2 байта).
1321*(6+2)=10568. А еще где ~5кб? уходят на вычисление
1.0/(x*(x+2.0))
?


Эскизы прикрепленных изображений
Прикрепленное изображение Прикрепленное изображение
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #3


Уникум
*******

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

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


Цитата(Client @ 15.02.2010 16:12) *
Получилось так. Терерь проблема со стеком.
Client, извини, но у тебя проблема не со стеком... no1.gif У тебя явная проблема с рекурсией. Твоя программа не будет считать правильно даже при гигабайтном стеке и с прекрасным приведением типов. В ней есть одна очень серьезная ошибка. Давай ты сначала отладишь прогу на FPC или Delphi, а потом уже будешь решать проблемы со стеком на ТР. Хорошо? smile.gif


Добавлено через 7 мин.
Цитата(Krjuger @ 7.02.2010 23:16) *
при этом есть тип Short, который может содержать целые числа о -32,768 до 32,767.Принципи вот из-за этого и происходит переполнение,но для мен лично небольшая загадка почему именно тип short береться для выполнения операций,а не сам integer.
Krjuger, ты извини, но ты так туманно выразился, что причину в твоих словах отыскать я так и не смог.
Типа short в TP нет. Есть тип shortint размером в 1 байт. А тип integer как раз и есть 2 байта, от -32К до +32К. Для того, чтоб не было вылетов по целым и по флоат, нужно правильно приводить типы. А причина останова в правильно реализованном алгоритме - это все-таки переполнение стека. И происходит оно в ТР при де... ой, чуть не проболтался! ))


--------------------
я - ветер, я северный холодный ветер
я час расставанья, я год возвращенья домой
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

Сообщений в этой теме
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


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

 





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