考虑递归的一个好方法是从基本情况开始,然后看看当你一次应用递归步骤时会发生什么。
基本情况:f(0)
这里的基本情况是x <= 0。 f(0) 的输出是什么?我们可以立即看到这一点,因为从未输入过 if 语句。基本情况输出是:
bert
递归步骤:f(1)
现在让我们看看f(1) 会发生什么。当x 为1 时,代码进入if 语句并最终调用f(0) 两次。如果将函数体中的1 替换为x,您会看到执行了以下语句:
System.out.println(1);
f(0);
System.out.println(1);
f(0);
System.out.println("bert");
println 语句的作用很明显,但是两个 f(0) 调用呢?好吧,我们知道f(0) 打印了什么,因为我们已经分析了基本情况。 f(0) 打印 bert。所以上面几行的输出是:
1 // System.out.println(1);
bert // f(0);
1 // System.out.println(1);
bert // f(0);
bert // System.out.println("bert");
递归步骤:f(2)
如果您对f(2) 应用相同的分析,您会看到它执行了:
System.out.println(2);
f(1);
System.out.println(2);
f(1);
System.out.println("bert");
如果我们在调用f(1) 的两个地方替换f(1) 的输出,我们得到:
2 // System.out.println(2);
1 // f(1);
bert
1
bert
bert
2 // System.out.println(2);
1 // f(1);
bert
1
bert
bert
bert // System.out.println("bert");
递归步骤:f(3)
最后,f(3) 执行:
System.out.println(3);
f(2);
System.out.println(3);
f(2);
System.out.println("bert");
代入f(2)的输出,我们得到:
3 // System.out.println(3);
2 // f(2);
1
bert
1
bert
bert
2
1
bert
1
bert
bert
bert
3 // System.out.println(3);
2 // f(2);
1
bert
1
bert
bert
2
1
bert
1
bert
bert
bert
bert // System.out.println("bert");