我无法理解代码如何通过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);
}
答案 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):
Modulo 10将始终打印最右边的数字。因此,这意味着在所有框架完成之后,您将剩下123456。如果期望值为1,那么您将如何修改您的解决方案? (提示:考虑基本情况!)