【问题标题】:Recursive Function Prints Large Unintended Values. Trying to Print Recursive Value Requested by Instructions.l递归函数打印大的非预期值。尝试打印 Instructions.l 请求的递归值
【发布时间】: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)。等等。

标签: java function recursion


【解决方案1】:

...然后以 n-1 的值调用自身 3 次... 意味着您只需将调用 sierpinski((n-1)) 一个接一个地复制 3 次,如下所示: p>

sierpinski((n-1));
sierpinski((n-1));
sierpinski((n-1));

或者你可以循环调用它们

for ( int i = 0; i < 3; i++ ) sierpinski(n-1);

然后你会看到你想看到的图案

【讨论】:

  • 有其他方法吗?像 3 * sierpinski 这样可以节省自己写 3 行而只写 1 行。另外,谢谢你的回答。
  • 你不能将一个函数乘以一个数字并期望它执行 3 次,你可以在一个循环中调用它 3 次,尽管在编辑的答案中。
猜你喜欢
  • 2021-07-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-02-18
  • 1970-01-01
  • 2017-06-22
  • 2019-09-09
相关资源
最近更新 更多