无法理解递归因子

时间:2016-03-19 08:21:18

标签: java recursion

我是递归的新手,我无法理解如何计算递归因子函数。

当我尝试用我的思想运行代码时,这就是我将其可视化的方式:

  

如果number = 4,

     

第一次回归:4 x 3

     

第二次回归:3 x 2

     

第3次回归:2 x 1

所以在我看来它是(4 x 3)*(3 x 2)*(2 x 1)但显然正确的返回将是4 X 3 X 2 X 1。我希望能够理解它是如何得到4 X 3 X 2 X 1.

 public static long factorial(long number) {
        if (number <= 1)
           return 1;
        else
        {
            System.out.println(number + " x " + (number-1) );
           return number * factorial(number - 1);
        }
     }

非常感谢任何帮助和解释。

3 个答案:

答案 0 :(得分:5)

您的可视化应该是:

  

如果number = 4,

     

第一次回归:4次(第二次回归)

     

第二次回归:3次(第3次回归)

     

第3次回归:2次(第4次回归)

     

第4次回归:1

然后按预期将其简化为4 x 3 x 2 x 1.

基本上,你需要区分“返回值x”和“返回递归结果,传入值x”。

答案 1 :(得分:1)

部分问题在于您的打印声明是谎言。将其更改为

System.out.println("factorial(" + number + ") = " + number + " x factorial(" + (number-1) + ")");

看看到底发生了什么。然后考虑您的打印输出类似于

的数学定义
     | n * (n-1)!     for n > 1
n! = | 
     | 1              for n == 0,1.

我发现将递归函数理解为函数是有帮助的。函数的一大好处是它们封装了计算,隐藏了特定的细节。这导致了信仰的递归跳跃 - 如果你有一个返回阶乘(n-1)的函数,无论它如何完成它,它都很容易用来计算阶乘(n)基于数学递归定义。相信函数将起作用使得编写函数(几乎)微不足道!

答案 2 :(得分:0)

我认为理解因子如何工作的关键是最后一次迭代的答案是返回的答案。

factorial的每次迭代必须等待以下迭代才能返回值。

执行的实际操作是1 * 2 * 3 * 4,而不是4 * 3 * 2 * 1。值从最后返回到第一个。