0

代码设计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. 我已经在 2nd design 中加入了 return 。所以它应该工作得很好。你也能给我详细解释一下吗?
4

8 回答 8

3

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
    }  
于 2012-08-07T06:25:28.163 回答
1

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

于 2012-08-07T06:21:36.530 回答
0

在方法中传递后,valuenum没有改变recursion

    if (num == 0) return;
    while (num > 0)
    {
        recursion( num - 1 );
        System.out.println(num);
        num--;                   // add this line.
    }   
于 2012-08-07T06:23:07.257 回答
0

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

于 2012-08-07T06:23:27.597 回答
0
   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--;
            } 
于 2012-08-07T06:26:32.327 回答
0

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

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

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

于 2012-08-07T06:32:54.740 回答
-2

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

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

于 2012-08-07T06:22:45.247 回答
-2

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

public static void main(String[] args){
    countdown(10);
}

public void countdown(int num){

    for(int i = num; i >= 0; i--){
        System.out.println(num);
    }
}
于 2012-08-07T06:24:37.583 回答