[英]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):
Modulo 10将始终打印最右边的数字。 因此,这意味着在所有框架完成之后,您将剩下123456。如果期望值为1,那么您将如何修改您的解决方案? (提示:考虑基本情况!)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.