2013-09-23 4 views
-1

Последний оператор возврата, выполняемый в функции factorial, равен return 1;, почему он возвращает правильное значение, а не 1?Как работают выражения факториала?

#include <iostream> 
using namespace std; 

unsigned int factorial(unsigned int); 

int main() 
{ 
    unsigned int a=4; 
    cout<<factorial(a); 

    return 0; 
} 

unsigned int factorial(unsigned int a) 
    { 
     if (a==0) 
      return 1; 
     else 
     return a*(factorial(a-1)); 
    } 
+2

'Последнего утверждение возврата выполняется в факторных функциях возвращает 1;' Это утверждение неверно. Что заставляет вас думать, что это правда? Я думаю, вы боретесь с концепцией рекурсии. Истинным утверждением будет выражение ** first ** return - '1', последнее - то, что когда-либо было правильным значением. – john

ответ

2

Может быть, это помогает

factorial(5) 
    calls factorial(4) 
     calls factorial(3) 
     calls factorial(2) 
      calls factorial(1) 
      returns 1 
     returns 2*1 (equals 2) 
     returns 3*2 (equals 6) 
    returns 4*6 (equals 24) 
returns 5*24 (equals 120) 

Как вы можете видеть, что это первое заявление возвращение, которое возвращает 1, не в последнюю очередь.

1

Заявление return 1; является условием остановки в рекурсивном вызове к факторного функции.

Убедитесь, что ссылки о концепции рекурсии: http://pages.cs.wisc.edu/~calvin/cs110/RECURSION.html

Простыми словами: Запуск при вызове, как факториал (3), последовательность вызовов будет:

--> return 3 * factorial(2) 
--> return 3 * 2 * factorial(1) 
--> return 3 * 2 * 1 * factorial(0) 
& Finally 

--> return 3 * 2 * 1 * 1 which is equal to 6 
0

Поскольку вызов факториал приводит к цепочке факториальных вызовов, которые умножаются вместе, последняя из которых является факториалом (0), которая возвращает 1.

Итак, факториал (4) вычисляется следующим образом:

factorial (4) = 4 * (factorial(3)) 
factorial (3) = 3 * (factorial(2)) 
factorial (2) = 2 * (factorial(1)) 
factorial (1) = 1 * (factorial(0)) 
factorial (0) = 1 

Сведя вместе:

factorial (4) = 4 * (3 * (2 * (1 * 1))) 
1

Почему он возвращает правильное значение, а не 1?

Хм ... возможно, из-за

return a * factorial(a - 1); 

?

2

Факторная функция вызывает себя до a == 0. factorial перестает называть себя и возвращает 1, но не сразу возвращается к main(), потому что ему нужно сначала вернуться ко всем вызовам к себе.

Функция, которая вызывает себя, называется рекурсивной функцией. Смотрите эту ссылку:

http://http://www.learncpp.com/cpp-tutorial/710-recursion/

Или по этой ссылке:

http://www.youtube.com/watch?v=UFL7GkAHnTQ

Смежные вопросы