【发布时间】:2021-11-28 16:48:47
【问题描述】:
据我所知,进行尾调用优化的前提是递归点应该是函数中的最后一句,并且递归调用的结果应该立即返回。但为什么呢?
这是 TCO 的一个有效示例:
int factorial(int num) {
if (num == 1 || num == 0)
return 1;
return num * factorial(num - 1);
}
那么,按照规则,下面的代码也可以优化吗?为什么不呢?
#include <stdio.h>
int factorial(int num) {
if (num == 1 || num == 0)
return 1;
int temp = num * factorial(num - 1);
printf("%d", temp);
return temp;
}
我想知道我应该如何向其他人解释为什么上述规则对于拥有 TCO 是必要的。但不仅仅是跟随。
【问题讨论】:
-
“为什么不”? -- 你回答了你自己的问题:因为“递归点应该是函数中的最后一句”,但不是(在递归计算点和返回点之间使用 temp)
-
在文件
yhspy.c中编译您的C 代码,将GCC 调用为gcc -Wall -Wextra -fverbose-asm -S -O2 vhspy.c,然后查看生成的vhspy.s汇编程序文件 -
最好的做法是永远不要使用递归。确定是否可以优化递归函数既不直观也不琐碎-您基本上必须自己反汇编并查看。如果不能优化,递归的使用几乎肯定在所有可能的方面都是错误的:低效、危险、不可读、不可维护。