int fact(int x)
{
if (x == 1)
return 1;
else
return (x * fact(x-1));
}
我的问题是如何在函数调用期间在堆栈上分配变量,如果
x = 5
-显然返回值是5 * fact(4)
,但是如何将这个5 * fact(4)
推送到堆栈上,如何在以后解析它的值,即可以推送简单值(而不是变量)并取回它们的值,但是编译器如何处理fact(4)
。有谁能详细解释一下编译器是如何实现这个递归过程的?
最佳答案
在返回5 * fact(4)
之前,将在新堆栈帧上调用并计算fact(4)
。当对fact(4)
的调用结束时,它会将其返回值放在fact(5)
堆栈帧可以到达的地方(这可能是堆栈或寄存器中),并使用它计算自己的返回值。因此,完成评估的顺序为fact(1)
,fact(2)
,…,fact(4)
,fact(5)
。每一个都将返回值放在下一个可以检索它并用于计算自己的返回值的地方。
关于c - 如何分配递归中的内存,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/20018928/