关于递归的内在功能的解释

时间:2013-08-25 16:09:54

标签: recursion

我见过以下代码:

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 个答案:

答案 0 :(得分:1)

.backwards想要帮助它,递归理解到

n/2最终不大于0时,f(n/2)返回void。然后父帧可以输出n%2并返回void,然后返回其父帧,依此类推,直到f的最顶层。

答案 1 :(得分:0)

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

答案 2 :(得分:0)

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

答案 3 :(得分:-1)

您的代码绝对正确,并显示正确的答案。即等于输入的十进制数的二进制数。只删除' ln'从输出行println(),以便答案可以水平出现。我们考虑从十进制到二进制转换的倒数顶部方法及其反向计算和打印,这是正确的。