繁体   English   中英

为什么递归调用打印“ 123456”而不是“ 1”?

[英]Why does the recursive call print '123456' instead of '1'?

我在理解代码如何通过x / 10去除原始值后如何恢复剩余整数时遇到麻烦。 幕后有什么事吗?

// precondition: x >= 0
// Question: What is printed from method call mystery(123456)?

public void mystery(int x) {
    if ((x/10) != 0) {
        mystery(x/10);
    }
    System.out.print(x % 10);
}

每个对mystery()的递归调用都在最终打印该数字的打印语句之前进行。 在函数再次开始执行之前,程序的当前状态已保存到堆栈中,因此在函数的最后一次执行时,当x / 10 = 0时,将打印1。 然后,程序返回到该函数的先前执行,其中x = 12,并继续执行该打印语句以打印12%10 =2。这将以相同的方式继续进行,直到程序到达该函数的顶级执行为止。

该页面说明了递归,并提供了一个阶乘示例的有用图表,该示例显示了如何调用和返回函数。

每次神秘的调用都会在JVM中创建一个新的堆栈框架。 这些框架用于存储参数,局部变量和为简洁起见而省略的其他数据。 在递归步骤(mystery(x / 10))中,每个新创建的堆栈帧将保存x / 10结果的一个连续较小的副本 。一旦达到基本情况,每个堆栈帧将随后打印其值。 x%10的副本

例如,mystery(123456):

  • 框架1:123456
  • 框架2:12345
  • 相框3:1234
  • 镜框4:123
  • 框架5:12
  • 框架6:1(已达到基本情况!现在将打印并返回每个框架)

Modulo 10将始终打印最右边的数字。 因此,这意味着在所有框架完成之后,您将剩下123456。如果期望值为1,那么您将如何修改您的解决方案? (提示:考虑基本情况!)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM