Java 如何在实践中理解递归的原理?

Java 如何在实践中理解递归的原理?,java,recursion,Java,Recursion,我开始学习递归,似乎我了解它们是如何工作的。但当我试图通过一个测验时,我发现我实际上没有通过。下面是我试图通过的最新任务中的一些代码。这里我试图找到一个阶乘。要做到这一点,我必须把从1到N的所有数字相乘 下面是一些代码: public class App { public static void main(String[] args) { f(1); } private static void f(int n) { System.out.print(n); if (n

我开始学习递归,似乎我了解它们是如何工作的。但当我试图通过一个测验时,我发现我实际上没有通过。下面是我试图通过的最新任务中的一些代码。这里我试图找到一个阶乘。要做到这一点,我必须把从1到N的所有数字相乘

下面是一些代码:

public class App {
public static void main(String[] args) {
    f(1);
}

private static void f(int n) {
    System.out.print(n);
    if (n < 7) {
        f(2 * n);
    }
}
}

我试着乘以这些num,然后将乘积乘以2。但当我看到结果不是5040时,我失败了。实际输出为1248。也许我的操作顺序不对?

让我们看看如何使用递归将数字从1乘以n:

public static void main(String[] args) {
    long result = mulFromOneTo(30);
}

private long mulFromOneTo(int number) {
   if (number == 1) {
       return 1;
   } else {
       return number * mulFromOneTo(number - 1);
   }
}

我不想给你完全准备好的源代码,但我希望它能对你有所帮助

Andrezj的回答是一个很好的自上而下的方法。让我们来看看代码不起作用的原因:

如果我们总结f所做的事情,它会打印n,当n小于7时,它会用2*n递归调用自己

在你的例子中,你首先调用f1,它打印1,调用f2,它打印2,调用f4,打印4,调用f8,打印8,然后停止

因此,您的函数不是打印数字1248,而是独立打印1、2、4和8


递归函数完成的总计算量是2*2*2*1,我投了反对票,因为即使这个问题显示了尝试,也没有显示研究结果。互联网上有大量关于递归的资料;他们中的大多数人也解释了阶乘。先学习概念。看这里,你所做的只是递归,而不是计算阶乘。N的阶乘,写成N!是N x N-1 x。。。。x2x1所以5的系数是5!=5x4x2x1=120。你只是把数字叠加在一起,并没有找到阶乘。正如其他人所指出的,在代码中实现阶乘之前,请了解更多关于阶乘的一般知识。