向后打印数字的奇怪逻辑

时间:2017-02-16 19:27:51

标签: java recursion

这是问题要求

编写一个接受整数参数n的方法writeNums,并按顺序打印前1个以1开头的整数,用逗号分隔。例如,以下调用产生以下输出:

呼叫输出 writeNums(5); 1,2,3,4,5

这是一个解决方案(部分是我的工作,部分是我在线搜索)。我不知道为什么这行writeNums(n - 1);向后打印数字?这有点令人困惑,因为我期待打印出来: 5,4,3,2,1

public class WriteNums
{
public static void main(String args[])
{
WriteNums wn=new WriteNums();
wn.writeNums(5);
}

public static void writeNums(int n) {
    if (n == 1)
      System.out.print("1");
    else {
      System.out.println(n);
      writeNums(n - 1);
      System.out.print(", " + n);
    }
  }

}

4 个答案:

答案 0 :(得分:2)

因为你正在使用递归,你打印的输出是在函数调用之后。

在函数调用之前进行,你将获得5,4,3,2,1

像这样:

public static void writeNums(int n) {
    if (n == 1)
      System.out.print("1");
    else {
        System.out.print(n+", ");
      writeNums(n - 1);
      //System.out.print(", " + n);
    }
  }

答案 1 :(得分:1)

您的程序会产生以下输出:

5
4
3
2
1, 2, 3, 4, 5

为什么这样做?

5
4
3
2
1

来自System.out.println(n);行。您正在调用writeNums(5),然后调用writeNums(4),调用writeNums(3)等。每次调用都会在新行上打n,然后再进行另一次递归调用。

此部分:, 2, 3, 4, 5在递归调用完成后由行System.out.print(", " + n);打印。因此writeNums(2)会在致电, 2之后打印writeNums(1)writeNums(3)会在致电, 3之后打印writeNums(2)等。

如果您希望程序打印1, 2, 3, 4, 5,只需删除System.out.println(n);行。

答案 2 :(得分:0)

程序正在向后打印数字,因为您要求它向后打印数字。看到递归调用的第一次迭代,首先打印n,然后从n-1开始。如果要按升序打印数字,请将方法更改为以下内容:

public static void writeNums(int m, int n) {
    if(n < 1) return;
    System.out.print(m);
    if(m == n) return;
    writeNums(m+1, n);
  }

然后从您的main方法中,将函数调用为writeNums(1, <n>);

答案 3 :(得分:0)

这些数字是向后打印的,因为你在打印数字之前调用相同的方法,它会自行运行直到遇到“if(n == 0)”,在那种情况下,它会自行完成并且能够继续执行下一行 “是System.out.print(”, “+ N)”。所以,这样打印所有序列。

public static void writeNums(int n) {
     if (n == 0){
            throw new IllegalArgumentException();
        }    
    else if (n == 1) {
            System.out.print(n);
        } else {
            writeNums(n-1);
            System.out.print(", " + n);
        }
    }