2015-11-02 87 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)' –