我认为Tail-recursive在函数式编程语言中非常有用。 C怎么样?
来自wiki:
可以在不添加新堆栈帧的情况下实现尾调用 调用堆栈。不需要当前程序的大部分框架 任何更多,它可以被尾调用的帧替换, 适当修改(类似于进程的覆盖,但用于 函数调用)。
然后程序可以跳转到被调用的子程序。生产这样的 代码而不是标准调用序列称为尾调用 消除
答案 0 :(得分:4)
Tail-recursive通常用在函数式语言中,因为它是在结构上实现循环的自然方式,而这些结构在过程语言中实际上没有那么多的递归。
因此,程序语言不需要它。但是,由编译器决定是否找到这样的优化。
答案 1 :(得分:2)
C标准和编译器都不支持尾递归。实现定义了编译器是否支持尾递归。
答案 2 :(得分:1)
C标准根本没有指定尾递归作为语言的一部分。 C99标准关于递归函数调用的唯一内容是:
6.5.2.2函数调用
11应允许直接或间接通过任何链进行递归函数调用 其他功能。
如果编译器可以检测尾递归并将递归调用转换为尾递归,则它可以但标准不需要这样做。
答案 3 :(得分:1)
ANSI(标准)C不需要尾递归。大多数C编译器都实现它,因为优化并不是非常复杂,它可以大大节省堆栈和高速缓存。
预ANSI,但是,C 肯定支持尾递归。这是通过goto
:
fact(n,m) { m =+ n; n--; if(n) goto fact; return n; }
请注意其他奇怪之处:+=
拼写为=+
,int
是所有变量的默认值。 pre-ansi C的源代码示例现在不常见,但v6 ed.c显着使用此方法进行错误处理。