2013-07-15 36 views
3

我有一段代碼,找出給定值的階乘數。我試圖通過調試代碼來找出代碼流。但我仍然對流程感到困惑。以下是我的代碼片段,任何人都可以幫助我理解流程嗎?析因邏輯如何工作?

static void Main() 
{ 
    long value = factorial(5); 
} 

static long factorial(long num) 
{ 
    if (num <= 1) 
     return 1; 
    else 
     return num * factorial(num - 1); 
} 
+0

這是一個遞歸函數 –

+3

在調試器中單步執行代碼是理解遞歸的一種可怕的方式:) –

+0

@ZiyaoWei 7個用戶極不可能提供適當的樣本。還有每個人都沒有投票。上傳並不一定意味着缺乏理解,儘管我沒有真正看到任何理解遞歸的人都能很好地提升這一點。 – Dukeling

回答

8

這就是所謂的recursion,它是計算機科學的一個基本概念。階乘函數是遞歸的典型例子,因爲它通常以遞歸方式定義。

factorial(0) := 1 
factorial(1) := 1 
factorial(n) := n * factorial(n - 1) 

因此,對於任意數量的0或1,階乘被定義爲一個恆定值,而對於任何數量的n> 1時,它可以通過遞歸地相乘來計算。該程序將繼續繁殖N,N-1,N-2,...,直到它到達1.

1

的方法是遞歸的,這意味着它調用自身。與每個連續的呼叫時,它通過1。實施例減少當前數目:階乘5:5 * 4 * 3 * 2 * 1 = 120。

階乘像這樣工作:

Original number: 5 
(5)*(5-1)*(5-2)*(5-3)*(5-4) 

一旦當前數量爲1或更小(0),該方法乘以1以前的值,這也是有用的,如果數最初傳遞給該方法10因爲兩者0!1!是1.

1

Recursive Methods in c#關於同一主題的有趣閱讀。

一個遞歸通常,有兩個規範:
- >遞歸方法調用自己很多次,直到滿意。
- >遞歸方法具有參數(多個),並用新的參數值調用自身。

Factorial by recursion Wiki

+0

@Tilak ..謝謝哥們。 C#鏈接中的遞歸方法是一個有用的方法:) –

2

這是遞歸函數,這意味着它與不同的輸入調用自身。它將繼續自我調用,直到它達到一個通常被稱爲「基本」情況的停止點。當到達基本情況時,所有函數調用都會產生一個整數返回值,這意味着可能會發生乘法運算,因爲返回值會在初始調用期間進行評估。開始時,這本質上是一個奇怪的事情,但這是一個非常有用的概念。

最後:階乘是經常用來解釋遞歸是如何工作的,但它也是當你不應該使用它最明顯的情況下。使用for循環可以更好地解決因子問題。 最常見的使用情況下,遞歸是當你不知道一個程序要多少次重複。因爲已確定您必須執行n次操作,因此N因子不是一個好的候選項。

1

遞歸是當一個函數調用自身。 遞歸函數允許您將複雜的問題劃分爲可輕鬆處理的相同單個簡單案例。這也是一個衆所周知的計算機編程技術:分而治之。