我有这个问题, 1)运行以下程序时显示的内容:
class Q1
{
public static void main(String[] args)
{
r(3);
}
public static void r(int x)
{
if (x == 1)
{
System.out.println("hello");
r(10);
}
else
if (x == 9)
System.out.println("bye");
else
{
System.out.println("good");
r(x-1);
System.out.println("bad");
}
}
}
在我的逻辑中,结果将是
good
good
hello
good
bye
但答案是
good
good
hello
good
bye
bad
bad
bad
为什么那些糟糕的底线会出现? 当最后一个r(9)被赋值给x时,程序遇到if(x == 9)语句,所以它应该停止,这就是我的想法。
请帮我解决这里的过程和逻辑! 我很困惑......
答案 0 :(得分:0)
你缺少程序执行的某些部分,当r为3,2和10时,程序打印'good',然后分别递归调用r(2),r(1)和r(9)。但是,还有一个语句,当被调用的递归函数完成其工作并返回到调用方法时,它最终会被执行。当r分别为10,2和3且按此顺序时,该部分将打印“坏”。
答案 1 :(得分:0)
在else块中:
id_rsa.pub
即使您以递归方式调用r(x-1),该方法中也没有任何内容退出程序或阻止r()方法完成,以及下一行打印“bad”无法运行。
答案 2 :(得分:0)
你正在递归地调用r()。在第一次迭代中,您将它转到最后一个,其中:
因为r(2)被调用,你对r(3)的原始调用被放在堆栈上,它将继续执行:
打印“坏”
当r(2)返回控制
时在递归调用中遵循相同的逻辑。
答案 3 :(得分:0)
给出函数r(int x)和main。
首先,您从函数调用开始:
r(3);
由于x不等于1或9,程序打印“good”并调用r(2);
同样的逻辑再次发生,所以程序打印“good”并调用r(1);
在函数调用r(1)中; x = 1所以程序打印“hello”并调用r(10);
对于r(10),与第一个r(3)和r(2)的逻辑相同,因此程序打印“good”并调用r(9)。
当调用r(9)时,程序打印“bye”并且不调用r(x)。
此时程序从调用r(x)的位置继续。
在3次调用r(x)时,x不等于9或1.因此程序打印“坏”3次。
答案 4 :(得分:0)
你的r(x)方法调用:
argument| x=1 | x=9 | other
--------+--------+------+--------------
code | hello | bye | good
| r(10) | | r(x-1)
| | | bad
所以你的调用看起来像是
r(3);
good
r(2); //because r(3-1)
bad
r(2);
调用的地方:
good
r(1); //because r(2-1)
bad
r(1);
调用的地方:
hello
r(10);
r(10);
调用的地方:
good
r(9); //because r(10-1)
bad
r(9);
调用的地方:
bye
如果您嵌套这些,您将获得
r(3){
good
r(2){
good
r(1){
hello
r(10){
good
r(9){
bye
}
bad
}
}
bad
}
bad
}
生成:
(from)
good r(3)
good r(2)
hello r(1)
good r(10)
bye r(9)
bad r(10)
bad r(2)
bad r(3)