递归方法错误地工作

时间:2017-11-24 11:32:59

标签: java recursion

使用递归方法编写简单的java代码来打印1 - 100。

以下是代码段

public class Test
{
    public static void main(String[] a)
    {
        printNumber(0);
    }

    public static void printNumber(int i)
    {
        if (i < 100)
        {
            System.out.println(i);
            i = i + 1;
            printNumber(i);
        }
        System.out.println(i);
    }
}

但代码打印

  

0,1,2,............ 100,100,99,................ 1

所以有人请告诉我为什么要打印100,99,98 ......... 1以及出了什么问题?

修改 我尝试了逻辑在所有组合中打印1 - 100并且对我来说效果很好,但输出应该是1 - 99(从内部条件打印),最后是100(打印最后打印),但输出是1 - 100和100 - 1。

所以请告诉我为什么在输出中打印100到1。

请不要告诉我逻辑,因为我已经得到了我期望的结果

5 个答案:

答案 0 :(得分:2)

使用此代码可行,因为当您致电printNumber (i)时,它会呼叫并进一步移动。在100之后,它将停止调用自身并且程序计数器返回到先前调用的函数,因此它打印100到0

   public class Test
{
    public static void main(String[] a)
    {
        printNumber(0);
    }
public static void printNumber(int i)
{
    if (i < 100)
    {
        System.out.println(i);
        i = i + 1;
        printNumber(i);
    }return;
}
}

答案 1 :(得分:1)

只需删除第二个print语句,如下所示:

public static void printNumber(int i)
{
   if(i<=100)
   {
      System.out.println(i);
      i = i + 1;
      printNumber(i);
   }
}

答案 2 :(得分:1)

递归工作正如它应该做的那样

每次调用printNumber(i);无论何时停止调用它,你都会在调用堆栈中上升,在这种情况下,当1 = 100时,它将取消堆栈并完成printNumber()内的代码,在这种情况下,代码的其余部分(在递归调用之后)是另一个打印。

java is pass by value以来,每个堆叠的通话都有不同的值:

  

当我说通过值时,它意味着无论何时调用者都调用了   callee参数(即:要传递给其他函数的数据)   复制并放入正式参数(被调用者的本地参数)   接收输入的变量)。 Java进行数据通信   从一个函数到另一个函数只在传递值中   环境。

所以它用每个值(100..1)调用prinln,注意它不会执行第一个(0),因为它已经增加到1。

答案 3 :(得分:-1)

public class Test 
{
   public static void main(String[] a) 
   {
      printNumber(0);
   }

public static void printNumber(int i)
{
    if(i<=100)
    {
        System.out.println(i);
        i+= 1;
        printNumber(i);
    }

} 

答案 4 :(得分:-1)

没有出错。 frist系统输出打印方法的访问值。 所以它在调用printNumber()之前打印值然后 第i个值达到101,第101个printNumber方法结束,线程返回到之前调用的方法。所以第二个系统打印出特定方法的i的值。