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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 03.06.2010, 23:12   #1
Figushkin
Пользователь
 
Регистрация: 20.05.2010
Сообщений: 31
По умолчанию Написать программу с рекурсивной функцией, вычисляющей: S по формуле.

Написать программу с рекурсивной функцией, вычисляющей:
формула1.jpg
Figushkin вне форума Ответить с цитированием
Старый 04.06.2010, 07:15   #2
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

1) какой язык ?!
2) это несложно:
вот полный текст рекурсивной функции:
Код:
function MySum(i : integer) : double;
begin
   if i=N then MySum := sqrt(N)
   else MySum := sqrt(i) + MySum(i+1)
end;
Serge_Bliznykov вне форума Ответить с цитированием
Старый 04.06.2010, 09:10   #3
Figushkin
Пользователь
 
Регистрация: 20.05.2010
Сообщений: 31
По умолчанию

1) Паскаль
2) я не понимаю рекурсивные ф-ции и процедуры
спасибо
Figushkin вне форума Ответить с цитированием
Старый 04.06.2010, 11:20   #4
coper
Пользователь
 
Регистрация: 16.11.2009
Сообщений: 28
По умолчанию

Попросите кого-нибудь объяснить. Это совсем не сложно. Достаточно разобрать пример вычисления n!

Цитата:
Сообщение от Serge_Bliznykov Посмотреть сообщение
1) какой язык ?!
2) это несложно:
вот полный текст рекурсивной функции:
Код:
function MySum(i : integer) : double;
begin
   if i=N then MySum := sqrt(N)
   else MySum := sqrt(i) + MySum(i+1)
end;
Функция зависит же от N? Не мойму где оно у вас фиксируется. И еще квадратный корень извлекается не из i а из i+Mysum(i+1).
По мне делать надо как то так:
Код:
function MySum(n : integer) : double;
begin
    MySum:=MySum_Help(1, n);
end;
function MySum_Help(i : integer, n: integer) : double;
begin
   if i=N then MySum_Help := sqrt(N)
   else MySum_Help := sqrt(i + MySum_Help(i+1))
end;

Последний раз редактировалось Stilet; 04.06.2010 в 13:04.
coper вне форума Ответить с цитированием
Старый 04.06.2010, 11:37   #5
Skif-F
Форумчанин
 
Регистрация: 24.03.2010
Сообщений: 349
По умолчанию

У меня сильное ощущение, что
Код:
function MySum(i : integer) : double;
begin
   if i=N then MySum := sqrt(N)
   else MySum := sqrt(i) + MySum(i+1)
end;
вычисляет просто сумму квадратов.
По-моему надо так:
Код:
function MySum(i : integer, a : double) : double;
begin
   if i>1 then MySum := MySum(i-1, sqrt(i+a))
   else MySum := sqrt(i+a)
end;
Прошу прощения, если в программе имеются синтаксические ошибки - ну, не знаю я Паскаль
Нет нерешаемых задач - есть недостаток времени и данных!
Skif-F вне форума Ответить с цитированием
Старый 04.06.2010, 12:57   #6
Z1000000
Форумчанин
 
Регистрация: 04.05.2010
Сообщений: 495
По умолчанию

Цитата:
По-моему надо так:
Так и есть правильно :

Код:
Program AAA;
function MySum(i : integer; a : Real) : Real;
begin
   if i>1 then MySum := MySum(i-1, sqrt(i+a))
   else MySum := sqrt(i+a)
end;
begin
writeln ( MySum(3,0) );
end.
Нажми на весы, поставь +
Для благодарностей : WebMoney WMR R252732729948
Z1000000 вне форума Ответить с цитированием
Старый 04.06.2010, 14:12   #7
Anatole
Форумчанин
 
Аватар для Anatole
 
Регистрация: 07.04.2009
Сообщений: 245
По умолчанию

В принципе рекурсия здесь не нужна, можно просто циклом
Код:
 S := sqrt(n);
for i:=n-1 downto 1 do S :=Sqrt(i+s);
Всякое безобразие должно быть единообразным. Тогда это называется порядком.
Anatole вне форума Ответить с цитированием
Старый 04.06.2010, 14:26   #8
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Сообщение от Skif-F
Код:
....   else MySum := sqrt(i) + MySum(i+1)
вычисляет просто сумму квадратов.
Вы абсолютно правы.

утром, в спешке, жуя бутерброд я ошибся..
вообще-то, я имел в виду такой код:

Код:
var N : integer;

function MySum(i : integer) : double;
begin
   if i=N then MySum := sqrt(N)
   else MySum := sqrt(i + MySum(i+1))
end;

begin
 N := 3;
 WriteLn( 'MySum = ',MySum(1) );
end.
N - глобальная (переменная или константа - по желанию программиста)

Хочу отметить, что Все вышуказанные программы (от Skif-F и от Z1000000) работоспособны и выдают (как и следовало ожидать ) одинаковый результат!

_________________
Цитата:
Сообщение от Anatole
В принципе рекурсия здесь не нужна, можно просто циклом
Anatole, в задании стоит сделать именно через рекурсию!

Последний раз редактировалось Serge_Bliznykov; 04.06.2010 в 14:32.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 04.06.2010, 14:58   #9
Anatole
Форумчанин
 
Аватар для Anatole
 
Регистрация: 07.04.2009
Сообщений: 245
По умолчанию

Цитата:
Anatole, в задании стоит сделать именно через рекурсию!
Я понимаю, но так хочется сделать решение более элегантным. А через рекурсию я бы делал так
Код:
Function MySum(n:integer):extended;
  Function RecursSum(i:integer): extended;
 begin
  if i = n then RecursSum := sqrt(n) else RecursSum := sqrt(RecursSum(i+1)+i)
 end;
 begin
   MySum := RecursSum(1);
end;
что практически совпадает с вашим решением, только n - локальное
Всякое безобразие должно быть единообразным. Тогда это называется порядком.

Последний раз редактировалось Anatole; 04.06.2010 в 15:36.
Anatole вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Помогите написать программу! Печать значений элементарных функций по формуле Тейлора Utah_jazz Общие вопросы C/C++ 2 06.12.2009 22:08
проблеммы с рекурсивной функцией. ciaonataha Общие вопросы C/C++ 2 21.07.2009 16:45
Си++ Составить программу на вычисление значения по формуле verpl Помощь студентам 3 28.05.2009 11:16
проблема с рекурсивной функцией world12_tk Помощь студентам 2 04.03.2009 20:57