Модераторы: volvo877, Snowy, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Вычисление факториала через рекурсивную процедуру, Нужно только через процедуру 
V
    Опции темы
Paradise
Дата 1.6.2009, 20:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 85
Регистрация: 22.11.2006

Репутация: нет
Всего: нет



Уважаемые знатоки, прошу вас подсказать как вычислить факториал через рекурсивную процедуру. Дело в том, что через функцию зделал легко, а на процедуре застрял. Задание такое ничего не могу поделать. Не знаю, либо я тупой, либо препод загнал))
PM MAIL   Вверх
volvo877
Дата 1.6.2009, 20:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2073
Регистрация: 15.11.2004

Репутация: 2
Всего: 116



Цитата(Paradise @  1.6.2009,  20:04 Найти цитируемый пост)
Дело в том, что через функцию зделал легко, а на процедуре застрял.
Странно. В принципе без разницы, функция это или процедура:
Код
procedure fact(n: integer; var f: longint);
begin
  if n = 1 then f := 1
  else begin
    fact(n - 1, f);
    f := f * n;
  end;
end;

{ вызов: }
var f: longint;
begin
  fact(6, f);
  writeln(f);
end.


PM MAIL   Вверх
Paradise
Дата 1.6.2009, 21:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 85
Регистрация: 22.11.2006

Репутация: нет
Всего: нет



Извините безголового, забыл сказать, что эту процедуру нужно потом использовать в формуле
с = n! / ( m! * ( n - m )! )
Вот на этом я и застрял...
PM MAIL   Вверх
volvo877
Дата 1.6.2009, 22:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2073
Регистрация: 15.11.2004

Репутация: 2
Всего: 116



Угу, ты застрял всерьез и надолго... По одной простой причине: процедуру НЕЛЬЗЯ использовать в формуле. Использовать можно только функцию. С помощью процедур можно посчитать значение вот этой формулы, конечно, но для этого тебе понадобится 3 дополнительных переменных... Тебе надо это извращение?

Вызывать - так же, как я показывал, все 3 выражения подряд, потом считать чему равно C:
Код
fact(n, n_f);
fact(m, m_f);
fact(n-m, nm_f);
C := n_f / (m_f * nm_f);

PM MAIL   Вверх
Paradise
Дата 1.6.2009, 22:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 85
Регистрация: 22.11.2006

Репутация: нет
Всего: нет



Вот именно, я не мог понять логику препода, сначала я подумал, что он перепутал с функцией, но когда нашел задачу и с фнукцией стал сомневаться в себе т. к. тут легче сделать даже через цыкл)) И это задание на гос екзамен, дурдом))
volvo877, спасибо огромное, вопрос решон  smile 
Прийднться делать через три переменных)
PM MAIL   Вверх
source777
Дата 1.6.2009, 23:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1878
Регистрация: 12.3.2007

Репутация: нет
Всего: 56



Цитата(volvo877 @  1.6.2009,  20:41 Найти цитируемый пост)
В принципе без разницы, функция это или процедура
Разница всё же есть, в случае процедуры ты вынужден использовать хвостовую рекурсию, которую компилятор спокойно развернёт в цикл. А в случае функции, далеко не все понимают почему необходимо писать: 
Код

function fact(n: integer; var f: longint): longint;
begin
  if n = 0 then fact:=f
  else begin
    fact(n - 1, f);
    f := f * n;
  end;
end;

function factorial(n: integer)
begin
  factorial:=fact(n, 1);
end;




Цитата(volvo877 @  1.6.2009,  22:23 Найти цитируемый пост)
С помощью процедур можно посчитать значение вот этой формулы, конечно, но для этого тебе понадобится 3 дополнительных переменных... Тебе надо это извращение?
Не обязательно так извращаться, достаточно:
Код

function factorial(n: integer)
var f:longint;
begin
  f:=1;
  fact(n, f);
  factorial:=f;
end;

C := factorial(n)/( factorial(m) *  factorial(n-m) );

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



Цитата(Paradise @  1.6.2009,  22:40 Найти цитируемый пост)
И это задание на гос экзамен, дурдом))
Такое простое?  smile Действительно дурдом.



--------------------
Если бы программистам платили за то, чтобы убирать код из программы вместо того, чтобы добавлять его, программы были бы намного лучше © Николас Негропонте
PM MAIL   Вверх
volvo877
Дата 2.6.2009, 09:25 (ссылка)    | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2073
Регистрация: 15.11.2004

Репутация: 2
Всего: 116



Цитата(source777 @  1.6.2009,  23:01 Найти цитируемый пост)
Не обязательно так извращаться, достаточно:

Вообще-то надо ЧИТАТЬ хотя бы заголовок темы, перед тем, как ответить... Ясно сказано: вычислять факториал через процедуру, с функцией автор сделал самостоятельно...

Цитата(source777 @  1.6.2009,  23:01 Найти цитируемый пост)
в случае процедуры ты вынужден использовать хвостовую рекурсию, которую компилятор спокойно развернёт в цикл
Вынужден? Кем это, интересно? Твоим заявлением? Где ты в коде видел хвостовую рекурсию? Умных слов начитался? Так почитай, хотя бы, что они означают... Во втором посте приведен код (который ты, кстати, скопировал), процедурой вычисляющий факториал безо всякой хвостовой рекурсии... Что я делаю не так?
PM MAIL   Вверх
source777
Дата 2.6.2009, 13:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1878
Регистрация: 12.3.2007

Репутация: нет
Всего: 56



Цитата(volvo877 @  2.6.2009,  09:25 Найти цитируемый пост)
Вообще-то надо ЧИТАТЬ хотя бы заголовок темы, перед тем, как ответить...
Что мешает вызывать полученную процедуру из функции? Ничего не мешает!


Цитата(volvo877 @  2.6.2009,  09:25 Найти цитируемый пост)
Вынужден? Кем это, интересно? Твоим заявлением? Где ты в коде видел хвостовую рекурсию?

Вот она:
Цитата(volvo877 @  1.6.2009,  20:41 Найти цитируемый пост)
procedure fact(n: integer; var f: longint);
begin
  if n = 1 then f := 1
  else begin
   fact(n - 1, f);
    f := f * n; // эту строчку можно передвинуть на одну вверх, для чистоты определений, впрочем тут это не суть важно.
  end;
end;



Цитата(volvo877 @  2.6.2009,  09:25 Найти цитируемый пост)
Во втором посте приведен код (который ты, кстати, скопировал), процедурой вычисляющий факториал безо всякой хвостовой рекурсии... Что я делаю не так? 
Всё так, там есть хвостовая рекурсия  smile 


Это сообщение отредактировал(а) source777 - 2.6.2009, 13:47


--------------------
Если бы программистам платили за то, чтобы убирать код из программы вместо того, чтобы добавлять его, программы были бы намного лучше © Николас Негропонте
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi"
THandle
Rrader
volvo877

Запрещается!

1. Обсуждать и делится взломанными компонентами или программным обеспечением

2. Публиковать ссылки на варез

3. Оффтопить

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, THandle, Rrader, volvo877.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Object Pascal: кроссплатформенные технологии | Следующая тема »


 




[ Время генерации скрипта: 0.0500 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.