Tail递归在C语言上真的很强大吗?

时间:2016-02-02 15:27:14

标签: c tail-recursion

我认为Tail-recursive在函数式编程语言中非常有用。 C怎么样?

  • C语言或编译器是否支持尾部呼叫消除
  • 程序是否为新呼叫创建新的堆栈帧?

来自wiki:

  

可以在不添加新堆栈帧的情况下实现尾调用   调用堆栈。不需要当前程序的大部分框架   任何更多,它可以被尾调用的帧替换,   适当修改(类似于进程的覆盖,但用于   函数调用)。

     

然后程序可以跳转到被调用的子程序。生产这样的   代码而不是标准调用序列称为尾调用   消除

4 个答案:

答案 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显着使用此方法进行错误处理。