仮想紙をつかんで、これを解決しましょう。
public class TestRecursion {
public static void main(String[] a) {
System.out.println(Recurse("Yes", 1));
}
public static String Recurse(String s, int n) {
if (n < 5)
return s+Recurse(s + n, n + 1);
else
return "End";
} // end Recurse()
}
では、最初から始めます。
n S s+Recurse(s+n, n+1)
1 Yes "Yes" + Recurse ("Yes1", 2)
2 Yes1 "Yes1" + Recurse ("Yes12", 3)
3 Yes12 "Yes12" + Recurse ("Yes123", 4)
4 Yes123 "Yes123" + Recurse ("Yes1234", 5)
5 Yes1234 "End" <- Here we go to the else block
したがって、スタックを展開すると、次のようになります。
n S s+Recurse(s+n, n+1)
5 Yes1234 "End" <- Here we go to the else block
4 Yes123 "Yes123" + "End"
3 Yes12 "Yes12" + "Yes123End"
2 Yes1 "Yes1" + "Yes12Yes123End"
1 Yes "Yes" + "Yes1Yes12Yes123End"
したがって、最終的にはYesYes1Yes12Yes123End
それでは、メソッドを変更しましょう。
public class TestRecursion {
public static void main(String[] a) {
System.out.println(Recurse("Yes", 1));
}
public static String Recurse(String s, int n) {
if (n < 5)
return Recurse(s + n, n + 1) + s;
else
return "End";
} // end Recurse()
}
では、最初から始めます。
n S Recurse(s+n, n+1) + s
1 Yes Recurse ("Yes1", 2) + "Yes"
2 Yes1 Recurse ("Yes12", 3) + "Yes1"
3 Yes12 Recurse ("Yes123", 4) + "Yes12"
4 Yes123 Recurse ("Yes1234", 5) + "Yes123"
5 Yes1234 "End" <- Here we go to the else block
スタックを展開すると、次のようになります。
n S Recurse(s+n, n+1) + s
5 Yes1234 "End" <- Here we go to the else block
4 Yes123 "End" + "Yes123"
3 Yes12 "EndYes123" + "Yes12"
2 Yes1 "EndYes123Yes12" + "Yes1"
1 Yes "EndYes123Yes12Yes1" + "Yes"
だから、私たちは最終的に得るEndYes123Yes12Yes1Yes