2015-11-02 104 views
-1

您好所有程序員#1,我是一個新手程序員,我想知道這個代碼的工作,如果你想請:)遞歸調用C#

class Program 
    { 
     static void Main(string[] args) 
     { 
      Hassn hassn = new Hassn(); 
      Console.WriteLine(Hassn.Factorial(5)); 
     } 
    } 
    class Hassn 
    { 
    public static double Factorial(double val) 
     { 
      if (val <= 0) return 1; 
      return val* Factorial(val - 1); 
     } 

    } 
+4

從這裏開始https://en.wikipedia.org/wiki/Recursive_function – Steve

+0

謝謝史蒂夫幫忙,但我不會說英語well.If你可以向我解釋這個例子 –

回答

2

編程語言使用「呼叫-stack「來跟蹤哪些函數被調用以及它們包含哪些值。每調用一次Factorial,它都會連同其變量值一起添加到堆棧中。這被稱爲上下文。因此,調用堆棧看起來像:

Factorial(5) 
Factorial(5) * Factorial(4) 
Factorial(5) * Factorial(4) * Factorial(3) 
Factorial(5) * Factorial(4) * Factorial(3) * Factorial(2) 
Factorial(5) * Factorial(4) * Factorial(3) * Factorial(2) * Factorial(1) 
Factorial(5) * Factorial(4) * Factorial(3) * Factorial(2) * Factorial(1) * Factorial(0) 

在這個階段,VAL == 0這樣1將從調用返回階乘(0)。這個上下文現在從調用堆棧中「彈出」,並且返回的值在下一個上下文中用於計算值(在本例中爲1 * 1),然後返回到下一個上下文(2 *(1 * 1 )):

Factorial(5) * Factorial(4) * Factorial(3) * Factorial(2) * Factorial(1) * 1 
Factorial(5) * Factorial(4) * Factorial(3) * Factorial(2) * (1 * 1) 
Factorial(5) * Factorial(4) * Factorial(3) * (2 * (1 * 1)) 
Factorial(5) * Factorial(4) * (3 * (2 * (1 * 1))) 
Factorial(5) * (4 * (3 * (2 * (1 * 1)))) 
(5 * (4 * (3 * (2 * (1 * 1))))) 

這是一個非常一般的解釋,我只是想爲您提供一個替代方案。試着瞭解,每次調用Factorial都嵌套在先前的調用中,然後所有返回值必須組合才能得到最終結果。

+0

是的,其實我需要這個答案,非常感謝,你能推薦一本特定的書或文章來閱讀關於堆棧 –

+1

任何關於數據結構的書將包含有關堆棧的信息,因爲它們在編程中用於許多不同的事情。谷歌的「堆棧數據結構」,並且有很多資源可以爲你解釋。 –

4
Factorial(5) -> 
5 * Factorial(4) -> 
5 * 4 * Factorial(3) -> 
5 * 4 * 3 * Factorial(2) -> 
5 * 4 * 3 * 2 * Factorial(1) -> 
5 * 4 * 3 * 2 * 1 * Factorial(0) -> 
5 * 4 * 3 * 2 * 1 * 1 
+0

謝謝你Jakub Lortz,我知道非常以及該過程有這種方式但我期望該函數將返回值1根據條件if(val <= 0)返回1; –

+1

@NourAhmed當val <= 0時它返回1。否則,它返回'val'乘以'Factorial(val - 1)' –