recursion - 编译器如何理解递归?

标签 recursion

在用 c 和 python 编程时,我已经熟悉递归,我猜它也用于许多其他语言,但是编译器实际上是如何解释递归函数的?它如何在自己的定义中使用该函数?

最佳答案

but how does a compiler actually interpret a recursion function? How can it use the function in it's own definition?



要理解这一点,您只需要了解编译器如何解释函数。对于 C 来说,函数只是一个符号,或者是一个指向内存中入口地址的指针。直观但不严格,函数调用将被编译为这样的汇编指令:
CALL address_of_function

看?编译器不需要知道函数是否是递归的。它只是让 CPU 跳转到函数入口的地址,继续执行指令。

这就是为什么我们可以使用该函数,即使它的定义没有完成。编译器只需要知道一个起始地址,或者一个符号,然后它就会知道跳转到哪里。函数体可以稍后生成。

但是,您可能想知道 尾递归 ,这是函数式编程语言中常见的特例。 “尾递归”意味着递归函数调用是函数定义中的最后一条语句。正如@paulsm4 提到的,在调用函数时,编译器需要将上下文和参数压入堆栈,然后恢复上下文并从中获取返回值。因此,如果您的函数调用自身然后调用自身...,则堆栈将太深,直到内存耗尽。但是如果函数调用是函数定义的最后一个语句,那么就没有必要在堆栈中保存上下文,我们可以覆盖它。因此,即使函数无限调用自身,堆栈也不会溢出。

关于recursion - 编译器如何理解递归?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40796473/

相关文章:

recursion - 在 Lisp 中组合列表,只使用 first 和 cons

java - 递归打印矩阵中的所有路径

sql - PostgreSQL 递归与

python - 反转未知深度的嵌套字典

c++ - 在任何编程语言中回溯

java - 递归 : not printing all permutations of a string. 缺少逻辑?

c - 通过子程序返回值

python - 如何递归模拟随机游走?无循环(Python)

c - a "fill function"在c语言中使用递归

sql - 递归 CTE 未获得预期结果。如何仅分配 anchor ?