如何以及在何处存储递归的中间结果?

时间:2013-10-07 15:27:35

标签: recursion compiler-construction interpreter

我试图了解递归在解释器方面是如何工作的。因此,我在R:

中实现了一个简单的递归函数
> fac <- function(x) {
+   print(x)
+   if(x==0) return(1)
+   else {x*fac(x-1)}
+ }
> 
> fac(4)
[1] 4
[1] 3
[1] 2
[1] 1
[1] 0
[1] 24
> 

我理解递归本身但不了解解释器如何存储临时结果。在此示例中,我们从fac(4)开始,它基本上返回4*fac(3),然后返回3*fac(2),依此类推。但是这些中期结果存储在何处或如何存储?一旦该函数执行其最终调用1*fac(0),它仍然需要总结先前调用的结果。但同样,这些必须事先存储或保存在内存中。我希望我想要问的是可以理解的。不确定如何正确解释......

1 个答案:

答案 0 :(得分:1)

每次通话的状态都在堆栈中。所有代都有自己的x版本,除了基​​本情况之外的每一个都在较低的递归完成后进行乘法运算。这被称为延续,使得这种递归函数不可能尾调用优化。在基本案例命中之后,在展开方面发生乘法。

如果您在基础案例中返回但不是return x*fac(x-1),则会出现奇怪的语言。似乎不一致。