Java 无法理解递归阶乘

Java 无法理解递归阶乘,java,recursion,Java,Recursion,我是递归的新手,我很难理解这个递归阶乘函数是如何计算的 当我试着用我的头脑来运行代码时,我就是这样想象它的: 如果数字=4 第一次返回:4 x 3 第二次返回:3 x 2 第三次返回:2 x 1 因此,在我看来,它是(4 x 3)*(3 x 2)*(2 x 1),但显然正确的回报应该是4 x 3 x 2 x 1。我想了解它是如何得到4x3x2x1的 public static long factorial(long number) { if (number <= 1)

我是递归的新手,我很难理解这个递归阶乘函数是如何计算的

当我试着用我的头脑来运行代码时,我就是这样想象它的:

如果数字=4

第一次返回:4 x 3

第二次返回:3 x 2

第三次返回:2 x 1

因此,在我看来,它是(4 x 3)*(3 x 2)*(2 x 1),但显然正确的回报应该是4 x 3 x 2 x 1。我想了解它是如何得到4x3x2x1的

 public static long factorial(long number) {
        if (number <= 1)
           return 1;
        else
        {
            System.out.println(number + " x " + (number-1) );
           return number * factorial(number - 1);
        }
     }
公共静态长阶乘(长数){

如果(数字您的可视化应该是:

如果数字=4

第一次返回:4 x(第二次返回)

第二次返回:3 x(第三次返回)

第三次返回:2 x(第四次返回)

第四回:1

然后,如预期的那样,简化为4x3x2x1


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

我认为理解阶乘如何工作的关键是,上一次迭代的答案是返回的答案

阶乘的每次迭代都必须等待后续迭代,然后才能返回值


实际执行的操作是1*2*3*4,而不是4*3*2*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)是很容易的。相信函数会工作,编写函数(几乎)是很简单的!

Jon的回答应该可以消除您的疑问,否则请尝试(调试器用于识别代码错误,这对于初学者来说是一个非常高级的话题),但它可以帮助清除程序流中的许多内容,因为您正在可视化打印行,而不是返回。返回是一个int。