java函式上的問題

2012-03-03 6:05 am

class Function

{

public static void main(String[] args)

{

System.out.println("5! = " + factorial(5));

}



static public int factorial(int n){

if (n == 1) { //函式終止的條件

return 1;

} else {

return n * factorial(n -1 );

}

}

}
程式執行的結果為: 5!=120

有人能告訴我為什麼 5!=120? 為什麼不是20? 5*(5-1)=20

回答 (2)

2012-03-03 11:58 pm
✔ 最佳答案
首先, 參考維基百科,
N! = N * (N-1)!
0! = 1
如果用上述程式段計算0!, 會出現錯誤(堆疊記憶體秏盡),
首先factorial中, IF語句條件應更改為:
if ( n <= 1 )

另為解答你問題, 以下是空運行:
factorial(5)
= 5 * factorial(4) // return n*factorial(n-1)
= 5 * 4 * factorial(3)
= 5 * 4 * 3 * factorial(2)
= 5 * 4 * 3 * 2 * factorial(1)
= 5 * 4 * 3 * 2 * 1 // return 1
= 120

所以輸出是:
5! = 120

ps. 5! = factorial(5)


2012-03-08 20:32:17 補充:
factorial(5)
= 5 * factorial(5-1) // return n*factorial(n-1)
= 5 * factorial(4)
= 5 * (4 * factorial(4-1)) // return n*factorial(n-1)
= 5 * 4 * factorial(3)
= 5 * 4 * (3 * factorial(3-1))
= 5 * 4 * 3 * factorial(2)
= 5 * 4 * 3 * 2 * factorial(2-1)
= 5 * 4 * 3 * 2 * factorial(1)
= 5 * 4 * 3 * 2 * 1

2012-03-08 20:32:41 補充:
= 20 * 6
= 120
2012-03-03 11:11 am
static public int factorial(int n)
{
if (n == 1) //函式終止的條件
{
return 1;
}
else
{
return n * factorial(n - 1); <---- call factorial recursively
}
}

有沒有留意到 factorial 函式是回遞式呼叫,不是一次過式呼叫。
第五次回傳值: 1
第四次回傳值: 2 * 1
第三次回傳值: 3 * 2
第二次回傳值: 4 * 6
第一次回傳值: 5 * 24


收錄日期: 2021-04-23 21:30:51
原文連結 [永久失效]:
https://hk.answers.yahoo.com/question/index?qid=20120302000051KK00726

檢視 Wayback Machine 備份