Модераторы: bsa
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Не понятен код рекурсии при вычислении факториала 
:(
    Опции темы
n199a
Дата 28.5.2013, 20:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Не понятно, по какому принципу действует рекурсия при вычислении факториала (как и в какой последовательности тут происходит) ?
Код

void Factorial(int n, int &fact)    // &fact - это ссылка, по которой передается параметр
{
printf("Введите n = ");
scanf("%d", &n);

     if (n == 0) fact = 1;         // рекурсия закончилась
     else {
          Factorial(n-1, fact);    // рекурсивный вызов, считаем (n-1)! (факториал)  // НАЧИНАЯ С ЭТОГО МЕСТА
          fact *= n;               // n! = n*(n-1)! (*= это присваивание с умножением)
          }
          
printf("Получилось: %d", fact);


Второй момент:
Код

int Factorial ( int n )
  {
   int i, fact = 1;
   for ( i = 2; i <= n; i ++ )
     fact *= i;
   return fact;
}

Допустим надо найти 4!.
4! = 4 * 3 * 2 * 1 = 24
В цикле for:
fact = 1 * 2 = 2
fact = 1 * 3 = 3
fact = 1 * 4 = 4
Т.е. return перемножает и возвращает значения переменной fact в Factorial?
Где я читал, везде было написано, что return только возвращает значение, а про перемножение не видел ничего...  smile 
PM MAIL   Вверх
Alexeis
Дата 29.5.2013, 00:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

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



  Когда функция вызывается для нее создаются свои локальные переменные, поэтому в каждом новом вызове себя переданное значение n будет на единицу меньше, а не такое как в прошлом вызове. По ссылке передается общая переменная аккумулятор fact в которой накапливается произведение. Даже не понятно что тут объяснять. 

  На счет 2й задачи оператор *= работает как fact = fact * i Т.е. тоже работает с накоплением. Произведение каждый раз накапливается. Т.е. если взять ряд
1  2  3  4 и т.д. , то его произведение будет вычисляться для цикла как 
(((1 * 2) * 3) * 4 ) * ... * n

А для рекурсии как

(((n * (n-1)) * (n-2)) * (n-3) * .. * 1


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
feodorv
Дата 29.5.2013, 07:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Тут что-то не то. Зачем в рекурсии переспрашивать о значении n?
Код

void Factorial(int n, int &fact)    // &fact - это ссылка, по которой передается параметр
{
     if (n == 0) fact = 1;         // рекурсия закончилась
     else {
          Factorial(n-1, fact);    // рекурсивный вызов, считаем (n-1)! (факториал)  // НАЧИНАЯ С ЭТОГО МЕСТА
          fact *= n;                 // n! = n*(n-1)! (*= это присваивание с умножением)
          }
}

...
int n, fact;
printf("Введите n = ");
scanf("%d", &n);
Factorial( n, fact);
printf("Получилось: %d", fact);



--------------------
Напильник, велосипед, грабли и костыли - основные инструменты программиста...
PM MAIL   Вверх
n199a
Дата 30.5.2013, 00:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Чтобы использовать функцию Factorial надо создать Factorial.h и потом его подключать через #include "Factorial.h"?

Это сообщение отредактировал(а) n199a - 30.5.2013, 00:14
PM MAIL   Вверх
EgoBrain
Дата 30.5.2013, 01:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 537
Регистрация: 23.3.2008
Где: Комната

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



Если реализация функции описана до кода её исползующего то прототип не нужен, если реализация описана после места использования или в отдельном модуле, то необходимо описать прототип перед кодом использования (в подключаемом заголовочном файле или в том же модуле).
В примере feodorv заголовочный файл не требуется.
PM MAIL ICQ Skype   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

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

1. Публиковать ссылки на вскрытые компоненты

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

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


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

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




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


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

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