Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 23.05.2009, 09:10   #1
(FainT)
 
Аватар для (FainT)
 
Регистрация: 23.05.2009
Сообщений: 5
По умолчанию Задача на языке Pascal. Рекурсия.

Добрый День! Являюсь студентом первого курса. Для получения автомата необходимо сдать несколько задач на рекурсию. С одной из которых возникают проблемы, причину которых я, к сожалению, не могу найти самостоятельно. Задача такая: Дано натуральное число n и действительное а. Вычислить с помощью рекурсии: 1/a + 1/a(a+1) + ... + 1/a(a+1)*..*(a+n). Среда Borland Pascal for Windows.

Программа, написанная мной БЕЗ использования рекурсии работает как часы. Сверял с MathCad'ом:

Код:
Program devat;
Uses WinCrt;
Var
i:byte;
a,s,p:real;
n:integer;
Begin
s:=0;
p:=1;
WriteLn('Vvedite chislo n: ');
Read(n);
WriteLn('Vvedite chislo a: ');
Read(a);
For i:=0 to n-1 do
 Begin
 p:=p*(a+i);
 s:=s+(1/p);
  End;
WriteLn('Otvet: ',s:7:3);
End.
Проблем нет. Рекурсивный же алгоритм вроде вычисляет то же самое, но чем меньше значение вводимых a и n, тем больше он начинает врать

Вот код:
Код:
Program rek9;
Uses WinCrt;
Var
a,p:real;
n:integer;

Function znam(a:real;n:integer):real;
Begin
If (n<0)then znam:=1
 Else znam:=(a+n)*znam(a,n-1);
End;

Function rek(a:real;n:integer):real;
Begin
If (n<0) then rek:=0
 Else rek:=(1/znam(a,n))+rek(a,n-1);
End;

Begin
ClrScr;
WriteLn('Vvedite chislo n: ');
Read(n);
WriteLn('Vvedite chislo a: ');
Read(a);
p:=rek(a,n);
WriteLn('Otvet: ',p:7:3);
End.
Проясните пожалуйста, почему так происходит. Самостоятельно разобраться не могу. Буду рад любой помощи. С уважением, [FainT].

Последний раз редактировалось (FainT); 23.05.2009 в 11:22.
(FainT) вне форума Ответить с цитированием
Старый 23.05.2009, 13:45   #2
Sazary
В тени
Старожил
 
Аватар для Sazary
 
Регистрация: 19.12.2008
Сообщений: 5,788
По умолчанию

А почему у вас в варианте без рекурсии:
Код:
For i:=0 to n-1 do
i идет до n-1?
Нужно-то до n. Иначе у вас пропадает одно слагаемое.

Тогда и ответы совпадать будут.
Вполне очевидно, чтобы что-то понять, необходимо книги читать.
Не нужно плодить бессмысленных тем. Вас Поиск избавит от многих проблем.

___________________________________ ___________________________________ _______
[=Правила форума=]_____[Поиск]_____[Литература по С++]____[Литература. Паскаль]
Sazary вне форума Ответить с цитированием
Старый 23.05.2009, 14:40   #3
(FainT)
 
Аватар для (FainT)
 
Регистрация: 23.05.2009
Сообщений: 5
По умолчанию

2Sazary

Да, действительно, при задании конечного значения как n результаты "классического" и рекурсивного алгоритмов совпадают. Однако, почему теряется элемент? Я делал цикл до n-1 из тех соображений, что начинается он с 0, а не с 1 (для получения первого элемента ряда необходимо равенство i нулю), в этом случае количество вычисляемых элементов не нарушается! Кроме того, результаты написанного мной "классического" кода полностью совпадают с результатами вычисления в MathCAD. Рекурсивный же алгоритм врет. =/
(FainT) вне форума Ответить с цитированием
Старый 23.05.2009, 14:49   #4
Sazary
В тени
Старожил
 
Аватар для Sazary
 
Регистрация: 19.12.2008
Сообщений: 5,788
По умолчанию

Посмотрите на ряд:
Код:
1/a + 1/a(a+1) + ... + 1/a(a+1)*..*(a+n)
Это можно переписать так:
Код:
1/(a+0) + 1/(a+0)(a+1) +...+ 1/(a+0)(a+1)*...*(a+n)
Теперь видите? Первое i = 0. Последнее - n.
Вполне очевидно, чтобы что-то понять, необходимо книги читать.
Не нужно плодить бессмысленных тем. Вас Поиск избавит от многих проблем.

___________________________________ ___________________________________ _______
[=Правила форума=]_____[Поиск]_____[Литература по С++]____[Литература. Паскаль]
Sazary вне форума Ответить с цитированием
Старый 23.05.2009, 15:25   #5
(FainT)
 
Аватар для (FainT)
 
Регистрация: 23.05.2009
Сообщений: 5
По умолчанию

Спасибо, теперь я убедился в собственной неправоте. Однако, как быть с несовпадением результатов вычислений? Получается, что оба алгоритма считают неправильно, и , следовательно, неверны =\
(FainT) вне форума Ответить с цитированием
Старый 23.05.2009, 15:33   #6
Sazary
В тени
Старожил
 
Аватар для Sazary
 
Регистрация: 19.12.2008
Сообщений: 5,788
По умолчанию

Да почему ж неверно-то?
Сейчас проверил в экселе:
a = 0.5
n = 3
Ответ: 4.019

Все правильно
Вполне очевидно, чтобы что-то понять, необходимо книги читать.
Не нужно плодить бессмысленных тем. Вас Поиск избавит от многих проблем.

___________________________________ ___________________________________ _______
[=Правила форума=]_____[Поиск]_____[Литература по С++]____[Литература. Паскаль]
Sazary вне форума Ответить с цитированием
Старый 23.05.2009, 15:45   #7
(FainT)
 
Аватар для (FainT)
 
Регистрация: 23.05.2009
Сообщений: 5
По умолчанию

Да, точно. Это я неправильную сверку делал! Спасибо огромное за помощь, ошибка как всегда в мелочи
(FainT) вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Рекурсия - сложная задача! RomT24 Паскаль, Turbo Pascal, PascalABC.NET 5 06.05.2009 23:14
Pascal.Умножние комплексных чисел.Рекурсия starlet Помощь студентам 9 19.04.2009 18:36
Рекурсия Pascal HoLToFF Помощь студентам 3 31.03.2009 22:25
Pascal: Рекурсия MaGWaY_minsk Помощь студентам 2 19.02.2009 09:46
Pascal. рекурсия. TOSAgrk Помощь студентам 2 04.02.2009 12:05