什么是尾递归优化
我们看 C 语言的一个例子:
#include <stdio.h>
#include <stdlib.h>
int sum(int x)
{
if (x == 0) return 0;
return x + sum(x - 1);
}
int tailsum(int x, int total)
{
if (x == 0) return total;
return tailsum(x - 1, total + x);
}
int main()
{
int y = sum(5);
printf("%d\n", y);
int z = tailsum(5, 0);
printf("%d\n", z);
}
简单的统计函数,sum 是递归调用,tailsum 是尾调用。
$ gcc -g -O0 -o test tail.c #不优化编译
$ objdump -d -M -intel test | grep -A20 "<sum>:"
从返回的汇编注意到call <sum>
就是很典型的递归调用,重复调用自己。这种状态下没有做任何优化。
$ gcc -g -O2 -o test tail.c #优化编译
$ objdump -d -M -intel test | gr