2013-09-23 101 views
-1

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)); 
    } 
+2

'在階乘函數執行的最後一個return語句返回1;'這個陳述是不正確的。是什麼讓你覺得這是真的?我想你正在苦於遞歸的概念。真正的陳述是**第一個**返回語句是'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,不是最後的第一個return語句。

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);