1

我看过以下代码:

1.    void f(int n){
2.            if (n>0){
3.                f(n/2);
4.                System.out.println(n%2);
5.            }
6.        }

我知道这是一个将十进制数转换为二进制数的递归代码。我遇到的问题是程序如何到达第 4 行。我的意思是当程序在第 3 行再次调用递归函数时,它不会超过第 4 行的代码吗?

还是程序所做的是调用第 3 行的函数,但将第 4 行的结果放入堆栈?(我考虑这种情况是因为我知道递归使用内存堆栈,在这种情况下似乎如此,因为结果以 LIFO 顺序打印)

有什么帮助吗?

4

4 回答 4

1

.backwards 想帮助它,递归理解 To

n/2finally 不大于 0 时,f(n/2)返回 void。然后父框架可以输出n%2并返回 void,然后是它的父框架,以此类推,直到 的最顶层框架f

于 2013-08-25T16:16:38.013 回答
0

到达某一点后,在这种情况下,当 n 小于或等于 0 时,函数开始返回,最后一次调用(n 小于或等于 0 的那个)完成执行,因为没有其他代码处理,堆栈上的前一个函数然后返回并执行其代码,一直重复调用堆栈

于 2013-08-25T16:16:41.050 回答
0

递归函数依赖于堆栈的行为。当对 f(n/2) 的内部调用完成时,将执行打印行。因此,一旦达到基本情况(n 不大于 0),这个 f 的堆栈帧将完成,然后每个先前的堆栈帧将被重新访问,因为对 f(n/2) 的每次调用都以与它们相反的顺序返回叫。

于 2013-08-25T16:14:40.337 回答
-1

您的代码是绝对正确的,并且它显示了正确的答案。即二进制等价于输入的十进制数。仅从输出行 println() 中删除“ln”,以便答案可以水平显示。我们考虑从十进制到二进制转换及其反向计算和打印的自上而下的方法,这是正确的..

于 2014-08-05T07:34:34.087 回答