java中的递归方法
我有这个代码,我只是想知道我对它的理解是否正确 5被传递到方法编号中,n现在等于5。if语句为false,因此它执行else语句,并执行java中的递归方法,java,recursion,Java,Recursion,我有这个代码,我只是想知道我对它的理解是否正确 5被传递到方法编号中,n现在等于5。if语句为false,因此它执行else语句,并执行numbers(5-1)和再次执行方法编号,并且还没有打印出n或返回 现在n=4,重复相同的方法,直到n=1,在哪一点返回?从这一点开始,它返回到n=2,跟随打印2(System.out部分),然后返回,在这一点上,它返回到n=3,打印3,然后返回..等等,一直到5 这就是我认为正在发生的事情,谁能帮我澄清一下,谢谢 public class test {
numbers(5-1)
和再次执行方法编号,并且还没有打印出n或返回
现在n=4,重复相同的方法,直到n=1,在哪一点返回?从这一点开始,它返回到n=2,跟随打印2(System.out部分),然后返回,在这一点上,它返回到n=3,打印3,然后返回..等等,一直到5
这就是我认为正在发生的事情,谁能帮我澄清一下,谢谢
public class test {
public static void main(String [] args){
numbers(5);
}
public static void numbers (int n){
if(n==1) return;
else{
numbers(n-1);
System.out.println(n);
return;
}
}
}
你的理解是正确的。您可以通过在调试器中单步执行代码来验证这一点。您的理解和代码是正确的。我所建议的是,没有必要在
else
块中使用return语句,因为您有适当的终止条件。所以在修改后,您的代码将是这样的
public class test{
public static void main( String[] args )
{
numbers(5);
}
public static void numbers (int n){
if(n==1) return;
else{
numbers(n-1);
System.out.println(n);
}
}
}
ps(预脚本)
为了尽可能少地修改OP的代码,我让代码不干净。为了获得额外的好处,您可以尝试简化上面的任何/所有示例,这样它们就不会同时使用if和else块,而只需使用一个if块,同时还可以去掉所有的return语句
祝你好运,并享受编码带来的乐趣。:)
是的,你的理解是正确的 然而,有一点需要澄清 我想你已经知道了,但是你的代码不会打印
1
。它将打印:
2
3
4
5
如果您还想打印1,那么您可以用3种不同的方式解决此问题
方法1
将n==1
条件更改为n==0
。这就是我要做的。这是最简单的,对我来说也是最自然的
public static void numbers (int n){
if(n==0) return;
else{
numbers(n-1);
System.out.println(n);
return;
}
}
方法2
将打印移到条件行之前
public static void numbers (int n){
System.out.println(n);
if(n==1) return;
else{
numbers(n-1);
return;
}
}
现在,您可能会猜到,这会将数字打印为
5
4
3
2
1
方法3
在这两种情况下都执行print,但在if块之后,而不是之前
public static void numbers (int n){
if(n==1){
// Do nothing, Don't return yet.
//return;
} else{
numbers(n-1);
// Don't return yet.
//return;
}
System.out.println(n);
}
附言
- 梅里顿说过使用调试器,调试器是你的朋友。在编码时,我建议使用or。我使用Eclipse已经很多年了,但由于谷歌似乎正朝着Android开发的IntelliJ方向发展,它可能也值得一试
n<0
?:)时会发生什么您的else{
和else{
中的返回值
是冗余的。这是正确的,它将永远运行(stackoverflow:))您可以通过将条件更改为if(n可能重复的空if
子句?Yucko!只需执行if!就可以更干净(n>1){numbers(n-1);}
后面跟着你的println
。我同意,我试着尽可能少地修改代码。我把OP的清理作为额外的学分。提到PS。可能我应该把它移到顶部。