Java 为什么这个递归函数的答案是8?

Java 为什么这个递归函数的答案是8?,java,recursion,Java,Recursion,这是一个简单的递归问题,我已经研究了一段时间了。基本上我理解f4将如何返回f3+f3,这些将返回f2+f2+f2+f2。然而,如果这些都加在一起,答案不是会大于8吗?我对递归还不熟悉,但我仍在努力理解这个概念 public class test{ public static int f(int n){ if(n <= 1){ return 1; } return f(n-1)+f(n-1);

这是一个简单的递归问题,我已经研究了一段时间了。基本上我理解f4将如何返回f3+f3,这些将返回f2+f2+f2+f2。然而,如果这些都加在一起,答案不是会大于8吗?我对递归还不熟悉,但我仍在努力理解这个概念

public class test{
    
    public static int f(int n){
        if(n <= 1){
            return 1;
        }
        return f(n-1)+f(n-1);
    }
    
    
    public static void main(String[]args){
        System.out.println(f(4));
    }
}

让我们从另一个方向看这个

f(1) = 1
f(2) = f(1) + f(1) = 2
f(3) = f(2) + f(2) = 2 + 2 = 4
f(4) = f(3) + f(3) = 4 + 4 = 8
从这里,我们可以看到答案是8。如果您希望得到不同的答案,您希望得到什么答案?您是如何得到这个答案的?

答案总是fn=2^n-1


f4=2^4-1=2^3=8

如果将调用分解为单独的语句,则更容易看到

public static void main(String[] args) {
    System.out.println(f(4));
}
    
public static int f(int n) {
    if (n <= 1) {
        return 1;
    }
    int r = f(n - 1);
    int s = f(n - 1);
    System.out.println("(r + s) = " + (r + s));
    return r + s;
}


不同的人响应不同的输出,因此您可以使用自己的打印语句进行更改。我通常发现,理解任何程序的逻辑流最有用的方法就是简单地在纸上写下每一步的状态,然后通过这种方式进行操作。

抓起笔和纸,看看当输入为0、1、2和3时,它会返回什么可能会很有用。在这一点上,我认为它的工作原理应该变得清晰了。结果如何会大于8?你可以看到可视化执行@User-Upvotedon'tsayThanks,我刚刚从你的链接到TinyURL网站。请检查它。@User-Upvotedon'tsaytanks那么我如何跟踪它?我只是找不到任何形式的大链接。
(r + s) = 2
(r + s) = 2
(r + s) = 4
(r + s) = 2
(r + s) = 2
(r + s) = 4
(r + s) = 8
8