2017-02-16 99 views
-2

这里打印数是问题要求奇怪的逻辑向后

编写接受整数参数n,并打印所述第一n个整数按顺序从1开始,以逗号分隔的方法writeNums。例如,下面的呼叫产生以下输出:

调用输出 writeNums(5); 1,2,3,4,5

这里是一个解决方案(部分是我的工作和部分,我在网上搜索)。我不明白为什么这行写了Num(n - 1);向后打印数字?这是一个有点混乱,因为我期待得到这个印刷: 5,4,3,2,1

​​
+0

查看递归和递归调用堆栈 – Coder

+0

当您逐步完成代码时,调试器显示的内容是什么? –

+0

如果number不是1,它再次调用writeNum(n-1),但是为什么system.out以相反的顺序打印? –

回答

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); 
    } 
    } 
+0

谢谢!我认为你的回复几乎解决了我的困惑。我现在正在刷牙递归技巧 –

+0

很高兴帮助!,我知道递归有时会令人困惑。 –

+0

你能接受它作为你的答案吗? –

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); 
    } 

然后从您的主要方法,调用该函数为writeNums(1, <n>);

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)将调用writeNums(1)返回后打印, 2writeNums(3)会如果你希望程序打印1, 2, 3, 4, 5只是删除System.out.println(n);线路的呼叫后打印, 3writeNums(2)回报等

0

的号码向后打印出来,因为您在打印号码前调用相同的方法,它会自己运行,直到满足“如果(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); 
        } 
    }