Форум программистов, компьютерный форум CyberForum.ru

рекурсия - C++

Восстановить пароль Регистрация
 
bruce_
1 / 1 / 1
Регистрация: 30.01.2013
Сообщений: 32
12.06.2013, 11:52     рекурсия #1
здравствуйте!
я начал изучать с++... дошел до функций (а именно рекурсии)... я понял, что рекурсия-это функция, которая сама себя вызывает.. так вот.. я решил написать примитивную программу для вычисления факториала...
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
#include <iostream>
using namespace std;
int fac(int a)
{
    if (a==0){return 1;}else{return a*fac(a-1);}
}
int main()
{
    int a;
    cin>>a;
    cout<<"n!="<<fac(a);
    return 0;
}
выводит правильно все правильно... но мне стало интересно: как я понял, если функция равно 0, то она вернет значение 1... а вот если не 0, то будет повторятся до того, пока она не будет равняться 0. Но если она будет равняться нулю, то программа должна же вывести 1, а выводит факториал числа... надеюсь, что вы поняли, что я имел в виду! покажите мне детально как будет работать моя программа, если я введу 5?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
12.06.2013, 11:52     рекурсия
Посмотрите здесь:

Рекурсия C++
C++ рекурсия
Рекурсия C++
Рекурсия C++
Рекурсия C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11845 / 6824 / 771
Регистрация: 27.09.2012
Сообщений: 16,919
Записей в блоге: 2
Завершенные тесты: 1
12.06.2013, 11:57     рекурсия #2
Цитата Сообщение от bruce_ Посмотреть сообщение
Но если она будет равняться нулю, то программа должна же вывести 1, а выводит факториал числа...
ну так 0! = 1

Добавлено через 1 минуту
Цитата Сообщение от bruce_ Посмотреть сообщение
покажите мне детально как будет работать моя программа, если я введу 5?
можете почитать эту тему:
Сумма цифр натурального числа
второй раз расписывать рекурсию лично я что-то не хочу
bruce_
1 / 1 / 1
Регистрация: 30.01.2013
Сообщений: 32
12.06.2013, 12:04  [ТС]     рекурсия #3
Croessmah, чуть чуть не поняли меня... что 0!=1 эт я знаю.. я имел ввиду, что если я возьму 5!, то получится так:
5!=0, поэтому return 5*fac(4).. т.е. из моих соображений будет так: 5*4*3*2*1*fac(1-1)... дальше же a=0.. выводится 120... но в программе же написано, что если а=0, то вернуть 1. вот что я спросил... почему она возвращает не 1 а 120?? получается, что число а не изменяется или как?
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11845 / 6824 / 771
Регистрация: 27.09.2012
Сообщений: 16,919
Записей в блоге: 2
Завершенные тесты: 1
12.06.2013, 12:08     рекурсия #4
bruce_, пройдите по ссылке из поста #2. Там подробно расписан порядок выполнения.

Добавлено через 1 минуту
Цитата Сообщение от bruce_ Посмотреть сообщение
но в программе же написано, что если а=0, то вернуть 1.
5*4*3*2*1*fac(0)
fac(0) возвратит один, то бишь получим перемножение всех этих чисел при выходе из вызванных функций

Добавлено через 56 секунд
Так же вот полезная ссылка:
Рекурсия и рекурсивные алгоритмы
bruce_
1 / 1 / 1
Регистрация: 30.01.2013
Сообщений: 32
12.06.2013, 12:10  [ТС]     рекурсия #5
Croessmah, почитал.. т.е. когда моя функция дойдет до 0, потом она все значения перемножит и вернет это значение?? т.е. программа будет работать до того момента, как не станет истинной??
Dani
1263 / 621 / 50
Регистрация: 11.08.2011
Сообщений: 2,236
Записей в блоге: 2
Завершенные тесты: 1
12.06.2013, 12:29     рекурсия #6
Смотри.
Ты вызываешь fac (5). Твоя функция видит только то, что 5 != 0, значит 5! == 4! * 5. Затем эта функция вызывает fac (4).

Вызвалась fac (4). Твоя функция видит только то, что 4 != 0, значит 4! == 3! * 4. Затем эта функция вызывает fac (3).

Вызвалась fac (3). Твоя функция видит только то, что 3 != 0, значит 3! == 2! * 3. Затем эта функция вызывает fac (2).

Вызвалась fac (2). Твоя функция видит только то, что 2 != 0, значит 2! == 1! * 2. Затем эта функция вызывает fac (1).

Вызвалась fac (1). Твоя функция видит только то, что 1 != 0, значит 1! == 0! * 1. Затем эта функция вызывает fac (0).

Вызвалась fac (0). Твоя функция видит только то, что 0 == 0, значит 0! == 1. Следовательно, 0! = 1.

Вызов fac (0) завершился. Возвращаемся в fac (1). Т.к. fac (1) = 0! * 1, то fac (1) = 1 * 1 = 1; (т.к. fac (0) = 1).

Вызов fac (1) завершился. Возвращаемся в fac (2). Т.к. fac (2) = 1! * 2, то fac (2) = 1 * 2 = 2; (т.к. fac (1) = 1).

Вызов fac (2) завершился. Возвращаемся в fac (3). Т.к. fac (3) = 2! * 3, то fac (3) = 2 * 3 = 6; (т.к. fac (2) = 2).

Вызов fac (3) завершился. Возвращаемся в fac (4). Т.к. fac (4) = 3! * 4, то fac (4) = 6 * 4 = 24; (т.к. fac (3) = 6).

Вызов fac (4) завершился. Возвращаемся в fac (5). Т.к. fac (5) = 4! * 5, то fac (5) = 24 * 5 = 120; (т.к. fac (4) = 24).

Вызов fac (5) завершился. Рекурсия завершена, возвращается значение 120.
bruce_
1 / 1 / 1
Регистрация: 30.01.2013
Сообщений: 32
12.06.2013, 12:35  [ТС]     рекурсия #7
Dani, ухх... спасибо) даже не думал, что она гармошкой идет)
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11845 / 6824 / 771
Регистрация: 27.09.2012
Сообщений: 16,919
Записей в блоге: 2
Завершенные тесты: 1
12.06.2013, 12:47     рекурсия #8
Цитата Сообщение от bruce_ Посмотреть сообщение
даже не думал, что она гармошкой идет)
bruce_, пост #4. Там ссылка. Почитайте, станет понятно что к чему
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
12.06.2013, 12:52     рекурсия
Еще ссылки по теме:

Рекурсия C++
C++ Рекурсия
C++ Рекурсия

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
bruce_
1 / 1 / 1
Регистрация: 30.01.2013
Сообщений: 32
12.06.2013, 12:52  [ТС]     рекурсия #9
Croessmah, спасибо) ознакомлюсь)
Yandex
Объявления
12.06.2013, 12:52     рекурсия
Ответ Создать тему
Опции темы

Текущее время: 19:01. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru