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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 15.02.2021, 12:52   #1
kilogram4ik
Пользователь
 
Регистрация: 15.10.2020
Сообщений: 68
По умолчанию Помогите сделать рекурсию

Составить рекуррентную функцию. Дано натуральное число N и действительное число a. Вычислить:
1/a+1/a*(a+1)+...+1/a*(a+1)...(a+n).

Но что-то не получается.

Код:
 var n : integer;
     x,a:real;
function MySum(x : real) : real;
var m:integer;
t:real;
begin

   if n=1 then MySum := (1/a)+1/a*(a+n)
   else
   begin
   n:=n-1;
   MySum := (1/a) + (1/a*(a+n)) + (t/(MySum(x)));
   t:=MySum(x);
   end;
end;

begin
  write('n=');
  readln(n);
  write('a=');
  readln(a);
 x:=1;
 WriteLn( 'MySum = ',MySum(x) );
end.
kilogram4ik вне форума Ответить с цитированием
Старый 15.02.2021, 19:13   #2
digitalis
Старожил
 
Аватар для digitalis
 
Регистрация: 04.02.2011
Сообщений: 4,536
По умолчанию

Это мне кажется, что я уже где-то видел ?
https://programmersforum.ru/showthread.php?t=338525
Вопросы задаём, ответы не читаем.

Последний раз редактировалось digitalis; 15.02.2021 в 19:15.
digitalis вне форума Ответить с цитированием
Старый 15.02.2021, 20:59   #3
kilogram4ik
Пользователь
 
Регистрация: 15.10.2020
Сообщений: 68
По умолчанию

digitalis, были бы ответы правильными еще
kilogram4ik вне форума Ответить с цитированием
Старый 15.02.2021, 21:42   #4
digitalis
Старожил
 
Аватар для digitalis
 
Регистрация: 04.02.2011
Сообщений: 4,536
По умолчанию

С этого места - поподробнее .
BDA - опытный программер, абы што не посоветует. Но уж мой вариант, хоть не рекурсивный, но работает ?
Завтра на свежую голову попробую сравнить варианты.
А что, рекурсия обязательна? На мой розум, вычислить значение функции по заданной рекурентной формуле можно без явной рекурсии, с циклами, например, как у меня.
А новую тему начинать не надо было, в продолжение той можно было сослаться на отрицательный результат. В прилагаемом коде нет и намёка на код ув. BDA. Там только один аргумент - х , а до какого n считать ? До посинения ? Ведь в задании - не ряд, который считают до достижения необходимой точности, а "осколок" этого ряда с заданным n.

Последний раз редактировалось digitalis; 15.02.2021 в 21:49.
digitalis вне форума Ответить с цитированием
Старый 15.02.2021, 23:43   #5
kilogram4ik
Пользователь
 
Регистрация: 15.10.2020
Сообщений: 68
По умолчанию

digitalis, я пытался сдать, то что он написал и то что вышло у меня в обеих случай все не верно. Задание нужно сделать при помощи рекурсии без нее препод не принимает работу.
kilogram4ik вне форума Ответить с цитированием
Старый 16.02.2021, 13:22   #6
digitalis
Старожил
 
Аватар для digitalis
 
Регистрация: 04.02.2011
Сообщений: 4,536
По умолчанию

Решение, выданное BDA, абсолютно правильное. Я проверил его вариант и свой, без рекурсии.
Для a=2.5, n=4 ответ одинаковый: 0,545010
А препода надо посылать на 3 буквы. Не он, а практика - критерий истины. Продемонстрировать ему оба варианта, убедиться, что результат правильный. Не верит - пусть проверит на куркуляторе или арифмометре "Железный Феликс" .
Код:
var a,y:Extended; i,n: integer ;

function summa (a:Extended;n:integer): Extended ;
var i: integer; tmp,s: Extended ;
begin
  s := 1/a ;
  tmp := 1/a ;
  for i := 1 to n do
    begin
      tmp := tmp/(a+i) ;
      s := s + tmp ;
    end ;
  summa := s;
end ;

function f(a: Extended; n, i: integer): Extended;
begin
  if i = 0 then
    f := f(a, n, i + 1) / a
  else if i > n then
    f := 1
  else
    f := 1 + f(a, n, i + 1) / (a + i);
end ;

begin
   a := 2.5 ;
   n := 4 ;
   i := 0 ;
   y := f(a,n,i) ;
   Writeln(y:9:6) ;
   y := summa(a,n) ;
   Writeln(y:9:6) ;
end;

end.
==================
 0,545010
 0,545010
digitalis вне форума Ответить с цитированием
Старый 17.02.2021, 01:51   #7
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,285
По умолчанию

digitalis, спасибо за лестный отзыв и проверку результатов расчета.
kilogram4ik, в учебных задачах часто требуется не только фактически верный расчет ответа, но и удовлетворение дополнительных требований (оформление кода; наименование функций и переменных; недопущение утечек памяти; заранее обговоренный список аргументов каждой функции; решение, аналогичное разобранному примеру; разрешение на изменение глобальных переменных; применение конкретных алгоритмов). Преподаватель даже мог сказать, что все неверно, чтобы услышать от вас обоснование верности решения.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Старый 17.02.2021, 03:03   #8
Desc
Участник клуба
 
Аватар для Desc
 
Регистрация: 21.11.2007
Сообщений: 1,063
По умолчанию

Цитата:
Сообщение от BDA Посмотреть сообщение
Преподаватель даже мог сказать, что все неверно, чтобы услышать от вас обоснование верности решения.
В точку.
ТС столкнулся со стандартной процедурой проверки на "вшивость". А именно, ориентируется студент в коде или нет.
I am not a wizard, I am just learning.
Desc вне форума Ответить с цитированием
Старый 17.02.2021, 09:42   #9
digitalis
Старожил
 
Аватар для digitalis
 
Регистрация: 04.02.2011
Сообщений: 4,536
По умолчанию

Напомнило: сижу на экзамене в Физтехе, готовлюсь. Однокурсник поворачивается ко мне и шепчет: "Скажи, только в двух словах, что это такое - числа Фибоначчи?" И это чел пришёл сдавать курс "Исследование операций" !
В оправдание его можно сказать, что мы были не студентами ФТ, а "слушателями факультета переподготовки", и 9 месяцев (длительность обучения, совпадение случайное )в Москве большинство использовало для изучения курса московских пивных и (изредка) театров вместо корпеть над перфокартами БЭСМ-6 в подвале ВЦ АН СССР

Последний раз редактировалось digitalis; 17.02.2021 в 09:44.
digitalis вне форума Ответить с цитированием
Старый 17.02.2021, 19:29   #10
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,285
По умолчанию

Опять же можно придумать много способов посчитать сумму рекурсией.
Код:
function f2(a: real; n: integer; var t: real): real;
begin
  if n = 0 then
  begin
    t := 1 / a;
    result := t
  end
  else
  begin
    result := f2(a, n - 1, t);
    t := t / (a + n);
    result := result + t;
  end;
end;
Код:
type seq = record
  sum, last: real
end;

function f3(a: real; n: integer): seq;
var
  tmp: seq;
begin
  if n = 0 then
  with result do
  begin
    last := 1 / a;
    sum := last;
  end
  else
  begin
    tmp := f3(a, n - 1);
    with result do
    begin
      last := tmp.last / (a + n);
      sum := tmp.sum + last;
    end;
  end;
end;
Достаточно затратный вариант по количеству вызовов:
Код:
function f4(a: real; n: integer): real;
begin
  if n < 0 then
    result := 0
  else if n = 0 then
    result := 1 / a
  else
    result := f4(a, n - 1) + (f4(a, n - 1) - f4(a, n - 2)) / (a + n);
end;
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Помогите решить задачу на рекурсию BULKAMAN Помощь студентам 0 24.12.2020 17:32
помогите сделать рекурсию kilogram4ik Помощь студентам 2 10.12.2020 16:43
Помогите реализовать рекурсию masha17 Общие вопросы C/C++ 2 30.10.2009 13:31