我是JAVA的初学者,我在跟踪递归和完全理解它时遇到了一些困难,所以在这里我有一个程序的代码,如果我们写3,它将输出:
1
12个
123个
12个
1
或者,如果我们写5,它将输出
1
12个
123个
1234
12345个
1234
123个
12个
1
public class Aufgabe3 {
private static void printSequenz(int n) {
if(n<1) {
return;
}
printLoToHi(n-1);
printMany(n);
printHiToLo(n-1);
}
private static void printHiToLo(int n){
if(n<1){
return;
}
printMany(n);
printHiToLo(n-1);
}
private static void printLoToHi(int n){
if(n<1){
return;
}
printLoToHi(n-1);
printMany(n);
}
private static void printMany(int n){
for(int i=1;i<=n;i++){
System.out.print(i);
}
System.out.println();
}
public static void main(String[] args) {
printSequenz(5);
}
}
现在这是我不明白的地方。例如,在方法printHiToLo中,它调用方法printMany(n),然后它调用自己为n-1,并重复直到n大于0.但我不明白printLoToHi方法是如何工作的?它是如何到达printMany方法的?如果它只是调用自己,直到n大于0.这对我来说真的很困惑...感谢有人帮助我:)
答案 0 :(得分:1)
private static void printLoToHi(int n){
if(n<1){ // This is the base case that terminates the recursion.
return; // You'll always have one - sometimes more.
}
printLoToHi(n-1); // This is where the recursion takes place.
printMany(n); // But when n < 1 it returns to here and continues on.
}
所以你看到它确实被调用了;仅在达到基本情况(n <1)之后。
一个简单的例子就是如果你用printLoToHi(1)
...
if
条件。n - 1
(0)作为参数调用自身。 n == 1
我们原来的方法。printMany(1)
被召唤。答案 1 :(得分:-1)
看,你的功能是逐行执行的。因此,在printLoToHi
中执行递归调用,然后调用printMany
。
例如,如何工作printLoToHi(3)
:
它检查3是否小于1.然后调用printLoToHi(2)
。
它检查2是否小于1.然后调用printLoToHi(1)
。
它检查1是否小于1.然后调用printLoToHi(0)
。
它检查0是否小于1.它是,所以它返回。
然后调用printMany(1)
。
然后调用printMany(2)
。
然后调用printMany(3)
。
您可以将递归调用视为单个函数,该函数执行某些操作但不考虑它是如何工作的。你可以假设它工作并编写函数的其他部分。如果该部分是正确的 - 递归是正确的。