C++ рекурсивная функция (факториал)

программирование С++

Уже задал этот вопрос
(http://otvety.google.ru/otvety/thread?fid=576903e1eac39afb00047414502104bf&tid=576903e1eac39afb)
Но видимо его никто не понял, или по другой причине я не получил ответа, которого ожидал.

На этот раз попытаюсь объяснить немного по-другому:

Вот есть функция:

long factorial (long a)
{
if (a > 1)
return (a * factorial (a-1));
else
return (1);
}

Я её вызываю например,
double b;
double b = factorial (5);

и получается, что переменной b присваивается правильное значение, равное 5! но
КАК!!?????

Ведь в самом конце 'a' уменьшится до 1, следовательно произойдет 'return (1);'
но этого не происходит! ПОЧЕМУ? присваивается переменной b не 1, а 5!

Примечание:
Спасибо всем за ответы.
Однако еще больше стало неясного!
Ответы:
1 будет как бы внизу стека :
5
4
3
2
1
А потом получиться как раз таки 1*2*3*4*5.
это происходит в самой глубокой итерации. потом мы по стеку возвращаемся выше и получаем заветные 5 * 4 * 3 * 2 * 1
Потому что b = factorial(5) = 5*factorial( factorial(4) ) = 5*factorial( 4* factorial(3) ) = 5*factorial(4* factorial(3*factorial(2))) = 5*factorial(4*factorial(3*factorial(2*factorial(1)))) = 5*factorial(4*factorial(3*factorial(2*1)))
*блин, даже запутался...
Если несколько упростить, то у тебя идет следующий вызов
для каждого вызова рекурсивной функции локальные переменные свои. Каждый раз, когда вызывается функция, для локальных переменных выделяется в стеке место в памяти. Буде примерно так
1. Вызов факториал из main с параметром 4
2. Создается переменная а со значением 5
3. По условию вызывается факториал с параметром 4
4. Создается локальная переменная со значением 4
...
~12. По условию возвращается просто 1
13. Возвращается 2*1
14. Возвращается 3*2
14. Возвращается 4*3
14. Возвращается 5*4 в основную функцию


15 лет назад

RPI.su - самая большая русскоязычная база вопросов и ответов. Наш проект был реализован как продолжение популярного сервиса otvety.google.ru, который был закрыт и удален 30 апреля 2015 года. Мы решили воскресить полезный сервис Ответы Гугл, чтобы любой человек смог публично узнать ответ на свой вопрос у интернет сообщества.

Все вопросы, добавленные на сайт ответов Google, мы скопировали и сохранили здесь. Имена старых пользователей также отображены в том виде, в котором они существовали ранее. Только нужно заново пройти регистрацию, чтобы иметь возможность задавать вопросы, или отвечать другим.

Чтобы связаться с нами по любому вопросу О САЙТЕ (реклама, сотрудничество, отзыв о сервисе), пишите на почту [email protected]. Только все общие вопросы размещайте на сайте, на них ответ по почте не предоставляется.