factorial
函数中执行的最后一个return语句是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));
}
答案 0 :(得分: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 :(得分:2)
阶乘函数调用自身直到a == 0
。 factorial会停止调用自身并返回1,但它不会立即返回main()
,因为它需要首先返回所有对自身的调用。
调用自身的函数称为递归函数。看到这个链接:
http://http://www.learncpp.com/cpp-tutorial/710-recursion/
或者这个链接:
答案 2 :(得分:1)
语句return 1;
是递归调用 factorial 函数的停止条件。
检查有关递归概念的链接:http://pages.cs.wisc.edu/~calvin/cs110/RECURSION.html
简单来说: 从像factorial(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
答案 3 :(得分:1)
嗯...也许是因为为什么它返回正确的值而不是1?
return a * factorial(a - 1);
答案 4 :(得分:0)
因为对factorial的调用导致一系列因子调用相乘,所以最后一个是factorial(0),返回1.
因此,factorial(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) ) )