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

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 >

我试图从解释器的角度来理解递归是如何工作的。因此,我在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(4)
开始,它基本上返回
4*fac(3)
然后
3*fac(2)
等等。但这些中期结果存储在哪里或如何存储?一旦函数执行了最后一次调用,即
1*fac(0)
,它仍然需要总结以前调用的结果。但是,这些数据必须事先存储或保存在内存中。我希望我想问的是可以理解的。不知道如何正确解释…

每个调用的状态都保留在堆栈中。所有的代都有自己的x版本,除基本情况外,每个代都在低级递归完成后执行乘法。这被称为一个延续,使得这个递归函数不可能进行尾部调用优化。乘法发生在基格命中后的展开侧


如果基本情况下有return,但没有
return x*fac(x-1)
,则使用奇怪的语言。似乎不一致。

每个调用的状态都保留在堆栈中。所有的代都有自己的x版本,除基本情况外,每个代都在低级递归完成后执行乘法。这被称为一个延续,使得这个递归函数不可能进行尾部调用优化。乘法发生在基格命中后的展开侧

如果基本情况下有return,但没有
return x*fac(x-1)
,则使用奇怪的语言。似乎前后矛盾