作者回复: 很高兴对你有帮助 : )
作者回复: 需要注意的是“递归调用语句必须作为函数返回前的最后一条语句”这个条件只是我们根据尾递归优化的原理,来为编译器能够进行优化所做的假设。而实际编译器是否可以通过其他方式做到“将函数递归调用优化为循环”,这个就属于编译器本身的能力范畴了。而之所以有这样的假设,是由于相较于函数的递归调用,循环只能够发生在同一个函数栈帧的环境中。因此,对于所有在函数返回前产生的中间变量值,实际上都无法被正常保存。而如果函数的正常执行依赖于这些中间结果,则尾递归优化将无法进行。比如这个例子: int factorial(int num) { if (num == 1 || num == 0) return 1; return num * factorial(num - 1); } 虽然其实现不满足尾递归优化的前提要求,但编译器却可在高优化等级下将它的实现由递归变为迭代。