【问题标题】:Why does the following code segment not output 9 and output 0 two times?为什么下面的代码段不输出 9 和输出 0 两次?
【发布时间】:2018-12-07 03:02:07
【问题描述】:

我是递归概念的新手,我对它的理解是,当它通过该方法时,它会构建堆栈,直到满足基本情况。话虽如此神秘(9),我认为它会输出

0,1,2,3,4,5,6,7,8,9 

而是输出了

0,0,1,2,3,4,5,6,7,8. 

我的问题是,如果堆栈应该包含神秘(9),为什么不输出 9 以及为什么/如何多次输出 0?当n = 0时,条件不会为假吗?

public static void mystery(int n) {
    if (n > 0) {
        n--;
        mystery(n);
    }
    System.out.print(n + " ");
}

【问题讨论】:

  • 我建议通过调试器运行它,看看“幕后”发生了什么,或者在纸上进行
  • 尝试用mystery(n-1);替换n--; mystery(n);
  • @Andreas 我做了,它输出了我的预测。我的问题是如何 n--;不同于神秘(n-1);不就是在做同样的事情吗?
  • @GBlodgett 我在纸上手写了它,但我一定做错了,因为我得到了错误的输出。我只是不知道为什么它是错误的。 n--; 有什么特别之处?与神秘(n-1)相反?
  • 1) 神秘(9) -> 如果语句检查 9 > 0 为真则 n--;表示现在 n = 8, stack.push(8) 2)神秘(8) -> if 语句检查 8 > 0 true then n--; n = 7,stack.push(7) ... 9)mystery(1) -> 1 大于 0,n-- 给我们 0 然后 stack.push(0) 10)mystery(0),当 n = 0如果语句返回 false 0 > 0 那么它将打印出 0,然后如您所说,它将打印保存到堆栈中的所有值 stack=[0,1,2,3,4,5,6,7,8]跨度>

标签: java recursion


【解决方案1】:

我的问题是,如果堆栈应该包含神秘(9),为什么不输出 9 以及为什么/如何多次输出 0?

看到n 接近于零是合乎逻辑的。然而,当n =< 0 时递归停止。所以让我们跳过所有递归调用,直到n==1

n 大于零,因此它会递减。 n == 0。下一次调用,n 不大于零,因此递归停止并打印出n

0

然后最后一个调用从堆栈中出来。请记住,您在通话前减少了n,所以它也是0

0 0

然后所有其他调用都以同样的方式离开堆栈:

0 0 1 2 3 4 5 6 7 8

9 永远不会打印,因为您在递归调用之前从 n 中减去。


两者的区别:

n--;

mystery(n-1);

你是在减少n你将它传递给函数。在

mystery(n -1);

mystery 的当前调用进入堆栈时,n 仍然是传入时的状态。或者在 9 的示例中:

if (n > 0) {
    //n is not changed here. It is still 9
    mystery(n -1); //Passes 8 to mystery
}
System.out.print(n + " ");

所以当它最终从堆栈中出来并命中打印语句时:

System.out.print(n + " ");
//n is still 9, so it will print 9

【讨论】:

    【解决方案2】:

    您的问题在于n--

    为什么?

    让我们尝试mystery(1) 作为基本解释。

    mystery(1) {
        if (1 > 0) {
            1--;
            mystery(0);
        }
        System.out.print(0 + " ");
    }
    

    你现在明白为什么了吗?


    不能修改 n 并期望它保持不变。

    尝试将其替换为:

    public static void mystery(int n) {
        if (n > 0) {
            mystery(n - 1); //minusByOne and pass it to the next call
        }
        System.out.print(n + " "); // n itself stays the same
    }
    

    【讨论】:

      【解决方案3】:

      首先,n-- 等于 n=n-1n--n-1 的区别在于前者将其值更新回相同的引用 n,后者返回一个新的 int。

      回到你问题的前半部分,为什么没有输出 9? 因为对于任何 n > 0,如果将 (1) 减去 1,(2) 进行一些递归,(3) 打印它,因此打印的值必须比输入的 n 小 1。

      为什么 0 打印了 2 次? 让我们解决问题,让n 为 1:

      (1) 将n 减去 1
      n 变为 0

      (2) 做一些递归
      在递归中 0 不会再被减去,但它仍然会被打印出来。这是控制台中的第一个 0

      (3) 从 (1)
      打印 n 打印第二个 0

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-05-08
        • 2020-02-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-04-20
        • 1970-01-01
        相关资源
        最近更新 更多