【问题标题】:Java : Recursion -While Loop Vs If LoopJava:递归 -While 循环与 If 循环
【发布时间】:2012-08-04 03:11:47
【问题描述】:

代码设计 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. 我已经在第二个设计中加入了退货。所以它应该工作 美好的。能否请您详细解释一下?

【问题讨论】:

  • 为什么这些答案中的大多数都被否决了?有 6 个答案基本相同。
  • 非常感谢大家。我想我得到的答案是我从所有这些帖子中得到的输入的组合。 1. 使用 if 循环 - 它调用 recursion(2)-->Recursion(1) 然后结束。 2) 使用 while 循环 - 它调用递归 2 --> 递归 1。现在递归 1 运行 system.out 但不运行进行递归调用并一直运行 while 循环。
  • 好。我也添加了解释。并接受对您最有帮助的答案。
  • 没有“if循环”这样的东西。
  • 抱歉,我的意思是 if 语句。

标签: java recursion if-statement while-loop infinite-loop


【解决方案1】:

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
    }  

【讨论】:

    【解决方案2】:

    进入while循环时num大于零,其值不变。

    【讨论】:

      【解决方案3】:

      numvalue 在通过recursion 方法后不会改变。

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

      【讨论】:

        【解决方案4】:

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

        【讨论】:

          【解决方案5】:

          无论是使用循环还是递归,不能同时使用两者。

          一般来说,如果一个人可以使用循环完成他想要的动作,他就不再考虑递归了,因为使用循环更快并且开销更少。

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

          【讨论】:

          • 你能解释一下后端是如何创建堆栈的吗?他们有什么价值和程序流程?
          • 堆栈是如何创建的,你问。我相信它与操作系统完全相关。快速搜索会给你一些有用的提示。我给你一个关于它的用法的简要解释(因为它不是这里的重点)对于每个函数调用,堆栈中(至少)有三个参数。这可能被视为间接费用。因此,如果我们有其他选择,我们最好避免这种情况。
          【解决方案6】:
             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--;
                      } 
          

          【讨论】:

            【解决方案7】:

            我不知道你为什么要经历这一切来做这样的功能?如果我没有收到您的问题,我深表歉意,但这是我建议的好代码..

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

            【讨论】:

            • 我不明白为什么我只得到了一个-1?如果您想纠正我,请发表评论,我会回复?谢谢......
            • 回答老问题,因为它仍未得到解答:他正在尝试构建递归,而不是迭代。
            【解决方案8】:

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

            编辑:是的,人们很乐意投反对票,不是吗?的确,引用与按值复制并不是正确的答案,但在我最初阅读他的代码示例时,它看起来像是对那个特定问题的误解。我的立场是正确的。

            【讨论】:

              猜你喜欢
              • 2013-08-12
              • 2020-06-28
              • 2016-03-19
              • 1970-01-01
              • 2016-02-27
              • 2011-02-09
              • 1970-01-01
              • 2021-05-03
              相关资源
              最近更新 更多