Java:递归-While Loop Vs If Loop

代码设计1:完美运行

public static void main (String[] args) { recursion(2); } public static void recursion(int num) { if (num > 0) { recursion( num - 1 ); System.out.println(num); } } 

代码设计2:无限循环。 ?

 public static void main (String[] args) { recursion(2); } public static void recursion(int num) { if (num == 0) return; while (num > 0) { recursion( num - 1 ); System.out.println(num); } } 
  1. 有人可以帮助我理解为什么第二个设计会进入无限循环吗?
  2. 我已经把回归放在第二个设计中了。 所以它应该工作得很好。 你也可以详细解释一下吗?

1.首先, if 不是循环 ,我们只有for循环, for-eachwhile循环和do-while循环。

2.第二个代码进入无限循环的原因是,你永远不会减少 num 的值

做这个….

 while (num > 0) { recursion( num - 1 ); System.out.println(num); num = num - 1; // Decrementing the value of num by 1 } 

输入while循环时,num大于零且其值不会更改。

recursion方法中传递之后, numvalue不会更改。

  if (num == 0) return; while (num > 0) { recursion( num - 1 ); System.out.println(num); num--; // add this line. } 

num的值在循环内不会改变。 所以它不断循环。

是否使用循环或递归,而不是同时使用它们。

通常,如果可以使用循环执行他想要的操作,则他不再考虑递归,因为使用循环更快且开销更少。

回到你的问题:
1.无限循环是不可避免的。 因为在循环中num没有减少。
2.当然有一些返回,但不是从你输入num = 2num = 1recursion的情况。
这是发生的事情:您输入num = 2recursion 。 它使用num = 1调用recursion 。 在那里,有无限的循环,当然还有无限的回报。 但是没有回归recursion(2)

  while (num > 0) { recursion( num - 1 ); System.out.println(num); } 

在你的while循环中你传递2代表num。 2总是大于0,所以它进入无限循环;

为了避免无限循环,你需要改变num变量的值;

  while (num > 0) { recursion( num - 1 ); System.out.println(num); num--; } 

我不知道你为什么要经历所有这样的function呢? 如果我没有收到你的问题,我很抱歉,但这是一个很好的代码我会建议..

 public static void main(String[] args){ countdown(10); } public void countdown(int num){ for(int i = num; i >= 0; i--){ System.out.println(num); } } 

原因是num是按值复制的,而不是作为recursion( num - 1 );调用的引用recursion( num - 1 );

编辑:Yeesh,人们很乐意投票,不是’他们? 确实,引用与复制值不是正确的答案,但在我最初阅读他的代码示例时,它看起来像是对该特定问题的误解。 我有所纠正。