【发布时间】:2021-02-10 00:47:57
【问题描述】:
我在下面调用这个递归函数:
public class formula {
public static void main(String[] args) {
int n = Integer.parseInt(args[0]);
sierpinski(n);
}
public static void sierpinski(int n) {
System.out.println(n);
if (n == 0) {
return;
}
else if (n > 0) {
sierpinski((n-1));
}
}
}
当我将参数保留为 n-1 时,我知道它会正常倒计时,但是当我将代码更改为
sierpinkski(3*(n-1));
我有下面提供的大值。
C:\Users\joseph\Desktop\CS111 - 2020\cs111-a5>java formula.java 2
2
3
6
15
42
123
366
1095
3282
9843
29526
88575
265722
797163
2391486
7174455
21523362
64570083
193710246
581130735
1743392202
935209307
-1489339378
这是因为它每次倒计时都在不断地乘以 3 并且变得非常大,直到有足够大的值低于零并停止?如果是这样,我该如何打印出来以使值与此匹配:
这些是指令: 编写一个递归函数 sierpinski(),它接受一个参数 n,打印值 n,然后用值 n-1 调用自身 3 次。当 n 变为 0 时,递归应该停止。
这一步是为了帮助绘制完整的三角形,但我想在继续之前了解该功能。感谢您的帮助和解释。
sierpinksi(0)
sierpinksi(1)
1
sierpinski(2)
2
1
1
1
sierpinksi(3)
3
2 1 1 1
2 1 1 1
2 1 1 1
sierpinksi(4)
4
3 2 1 1 1 2 1 1 1 2 1 1 1
3 2 1 1 1 2 1 1 1 2 1 1 1
3 2 1 1 1 2 1 1 1 2 1 1 1
sierpinksi(5)
5
4 3 2 1 1 1 2 1 1 1 2 1 1 1 3 2 1 1 1 2 1 1 1 2 1 1 1 3 2 1 1 1 2 1 1 1 2 1 1 1
4 3 2 1 1 1 2 1 1 1 2 1 1 1 3 2 1 1 1 2 1 1 1 2 1 1 1 3 2 1 1 1 2 1 1 1 2 1 1 1
4 3 2 1 1 1 2 1 1 1 2 1 1 1 3 2 1 1 1 2 1 1 1 2 1 1 1 3 2 1 1 1 2 1 1 1 2 1 1 1
【问题讨论】:
-
只需查看数字即可了解其增长的原因:您首先调用
sierpinkski(2)(此处为n == 2),它会打印2。现在你用sierpinkski(3*(n-1)) == sierpinkski(3*1) == sierpinkski(3)进行递归。因为你已经传入3,所以你有n == 3,下一个递归sierpinkski(3*(n-1)) == sierpinkski(3*2) == sierpinkski(6)。等等。