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

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

Вернуться   Форум программистов > Delphi программирование > Паскаль, Turbo Pascal, PascalABC.NET
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 27.05.2013, 14:39   #1
Crazy-kun
Пользователь
 
Аватар для Crazy-kun
 
Регистрация: 27.05.2013
Сообщений: 11
По умолчанию Рекурсия. Вычисление произведения с заданной точностью

Нужно сделать задание с помощью рекурсии, но дело в том что я совершенно не понимаю как правильно составлять рекурсию и условие к ней. Из всех моих попыток получалось в результате либо 0 либо выполнение программы завершалось переполнением стека.
Код:
program rel;

function pro(n: integer): real;
    begin
        if n=1 then pro:=1
        else pro := pro(n+1) * (1-1/n*n)
    end;
begin
    writeln(pro(1));
end.
Помогите придумать рекурсивную функцию.
Изображения
Тип файла: png rek.png (2.6 Кб, 38 просмотров)
Crazy-kun вне форума Ответить с цитированием
Старый 27.05.2013, 15:49   #2
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,291
По умолчанию

Код:
function pro(n: integer): real;
var
  a: real;
begin
  a := 1 - 1 / (n * n);
  if a < 0.001 then
    pro := a
  else
    pro := a * pro(n + 1);
end;

begin
  writeln(pro(1));
end.
Правда, на данный момент точность определяется неправильно (пока не могу придумать, как определить точность для произведения).
Это произведение стремится к нулю.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )

Последний раз редактировалось BDA; 27.05.2013 в 16:26.
BDA на форуме Ответить с цитированием
Старый 27.05.2013, 16:18   #3
Crazy-kun
Пользователь
 
Аватар для Crazy-kun
 
Регистрация: 27.05.2013
Сообщений: 11
По умолчанию

BDA, какая простая реализация, а я такую кучу нагородил.
Код:
program rek;
const e=0.001;
var x:integer;

function pro(n:integer):real;
    begin
        if n=1 then pro:=1 else
        pro:=pro(n-1)*(1-1/(n*n));
    end;

begin
    x:=2;
    repeat pro(x);
        x:=x+1;
    until abs((pro(x)-pro(x-1)))<e;
    writeln(pro(x):5:10);
end.
Проблему со нулевым результатом решил: там при условии n=1 получается что
1-1/(1*1)=0, так что я прописал терминальную ситуацию где при n=1 первый член тоже равен единице.

Все равно спасибо за ответ, я уже третий день голову ломаю.
Crazy-kun вне форума Ответить с цитированием
Старый 27.05.2013, 16:44   #4
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,291
По умолчанию

И правда при n = 1 получается 0, из чего следует, что все произведение равно 0.
Выбросим вообще первый множитель.
Тогда:
Код:
const e = 0.001;
 
function prog(n: integer; d: real):real;
begin
  if d < e * n * n then
    prog := d * (1 - 1 / (n * n))
  else
    prog := prog(n + 1, d * (1 - 1 / (n * n)));
end;
 
begin
  writeln(prog(3, 0.75):5:10);
end.
Ваш код подсказал мне способ сравнения.
Умножение начинается со 2 множителя. Этот множитель равен 0.75, а следующий множитель имеет номер 3. С него-то и начинаем рекурсию, которая также, как и у Вас, сравнивает предыдущий и текущий ряды.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )

Последний раз редактировалось BDA; 27.05.2013 в 16:49.
BDA на форуме Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Вычисление рядов заданной точностью Neutron37 Паскаль, Turbo Pascal, PascalABC.NET 0 29.09.2010 20:14
Вычисление числа e, Pi с заданной точностью MrakSPb Общие вопросы C/C++ 3 12.05.2010 12:51
Вычисление определенного интеграла с заданной точностью Arzamaks Помощь студентам 9 19.02.2010 10:09
Вычисление функции с заданной точностью. Absent Помощь студентам 1 21.11.2008 13:30