这里打印数是问题要求奇怪的逻辑向后
编写接受整数参数n,并打印所述第一n个整数按顺序从1开始,以逗号分隔的方法writeNums。例如,下面的呼叫产生以下输出:
调用输出 writeNums(5); 1,2,3,4,5
这里是一个解决方案(部分是我的工作和部分,我在网上搜索)。我不明白为什么这行写了Num(n - 1);向后打印数字?这是一个有点混乱,因为我期待得到这个印刷: 5,4,3,2,1
这里打印数是问题要求奇怪的逻辑向后
编写接受整数参数n,并打印所述第一n个整数按顺序从1开始,以逗号分隔的方法writeNums。例如,下面的呼叫产生以下输出:
调用输出 writeNums(5); 1,2,3,4,5
这里是一个解决方案(部分是我的工作和部分,我在网上搜索)。我不明白为什么这行写了Num(n - 1);向后打印数字?这是一个有点混乱,因为我期待得到这个印刷: 5,4,3,2,1
它,因为你正在使用递归,您打印输出是函数调用之后。
之前函数调用让它和你将得到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);
}
}
谢谢!我认为你的回复几乎解决了我的困惑。我现在正在刷牙递归技巧 –
很高兴帮助!,我知道递归有时会令人困惑。 –
你能接受它作为你的答案吗? –
程序向后打印的数字,因为你要求它打印数字落后。看到在你的递归调用第一次迭代中,您先打印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>);
你的程序产生的输出如下:
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)
返回后打印, 2
,writeNums(3)
会如果你希望程序打印1, 2, 3, 4, 5
只是删除System.out.println(n);
线路的呼叫后打印, 3
到writeNums(2)
回报等
。
的号码向后打印出来,因为您在打印号码前调用相同的方法,它会自己运行,直到满足“如果(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);
}
}
查看递归和递归调用堆栈 – Coder
当您逐步完成代码时,调试器显示的内容是什么? –
如果number不是1,它再次调用writeNum(n-1),但是为什么system.out以相反的顺序打印? –