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

时间:2019-05-24 00:40:39

标签: java recursion

我无法理解代码如何通过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);
}

2 个答案:

答案 0 :(得分:0)

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

This page解释了递归,并为阶乘示例提供了一个有用的图表,显示了如何调用和返回函数。

答案 1 :(得分:0)

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

例如,神秘(123456):

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

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