- 论坛徽章:
- 0
|
本帖最后由 linyunxian 于 2014-01-23 16:24 编辑
一直听说尾递归的效率高是因为它会被编译器优化,不会有产生调用栈的开销。
可从调试来看,却没发现我普通的递归有什么差别。
下面是尾递归的测试实例。
- long long fact_tr_aux(long long n, long long *result)
- {
- printf("%x\n", &n); /* print &n in stack */
- if (n==0 || n==1)
- return *result;
- *result *= n;
- return fact_tr_aux(n-1, result);
- }
- long long fact_tr(long long n)
- {
- long long result = 1;
- return fact_tr_aux(n, &result);
- }
- int main(int argc, char *argv[])
- {
- printf("%lld\n", fact_tr(atoi(argv[1])));
- return 0;
- }
复制代码 无论从汇编还是gdb看调用栈,都发现一样的在栈上分配递归了。
这是为什么?
谢谢各位的回复。
总结一下:gcc也可能会对尾递归优化,前提是递归栈里没有变量需要保存。
注释掉这行似乎就可以: printf("%x\n", &n); /* print &n in stack */
gcc不能判断&n是否属于上个栈帧上,所以没有优化。 |
|