我试图了解递归在解释器方面是如何工作的。因此,我在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)
,它仍然需要总结先前调用的结果。但同样,这些必须事先存储或保存在内存中。我希望我想要问的是可以理解的。不确定如何正确解释......
答案 0 :(得分:1)
每次通话的状态都在堆栈中。所有代都有自己的x版本,除了基本情况之外的每一个都在较低的递归完成后进行乘法运算。这被称为延续,使得这种递归函数不可能尾调用优化。在基本案例命中之后,在展开方面发生乘法。
如果您在基础案例中返回但不是return x*fac(x-1)
,则会出现奇怪的语言。似乎不一致。