Recursion 递归中的中间结果如何存储以及存储在何处?
我试图从解释器的角度来理解递归是如何工作的。因此,我在R中实现了一个简单的递归函数:Recursion 递归中的中间结果如何存储以及存储在何处?,recursion,compiler-construction,interpreter,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) [1] 4 [1] 3 [1] 2 [1] 1 [1] 0 [1] 24 >
> 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)
[1] 4
[1] 3
[1] 2
[1] 1
[1] 0
[1] 24
>
我理解递归本身,但不理解解释器如何存储中间结果。在这个例子中,我们从
fac(4)
开始,它基本上返回4*fac(3)
然后3*fac(2)
等等。但这些中期结果存储在哪里或如何存储?一旦函数执行了最后一次调用,即1*fac(0)
,它仍然需要总结以前调用的结果。但是,这些数据必须事先存储或保存在内存中。我希望我想问的是可以理解的。不知道如何正确解释…每个调用的状态都保留在堆栈中。所有的代都有自己的x版本,除基本情况外,每个代都在低级递归完成后执行乘法。这被称为一个延续,使得这个递归函数不可能进行尾部调用优化。乘法发生在基格命中后的展开侧
如果基本情况下有return,但没有
return x*fac(x-1)
,则使用奇怪的语言。似乎不一致。每个调用的状态都保留在堆栈中。所有的代都有自己的x版本,除基本情况外,每个代都在低级递归完成后执行乘法。这被称为一个延续,使得这个递归函数不可能进行尾部调用优化。乘法发生在基格命中后的展开侧
如果基本情况下有return,但没有return x*fac(x-1)
,则使用奇怪的语言。似乎前后矛盾