有人可以给我展示一个简单的C ++尾递归函数吗?为什么尾部递归更好甚至更好?除尾递归外,还有哪些其他递归?
3 回答
![?](http://img1.sycdn.imooc.com/54584dd900014f6c02200220-100-100.jpg)
DIEA
TA贡献1820条经验 获得超2个赞
C ++中的尾部注释看起来与C或任何其他语言相同。
void countdown( int count ) {
if ( count ) return countdown( count - 1 );
}
尾递归(通常是尾调用)要求在执行尾调用之前清除调用者的堆栈帧。对程序员而言,尾递归类似于循环,return简化为goto first_line;。但是,编译器需要检测您在做什么,如果没有,则仍然会有一个额外的堆栈帧。大多数编译器都支持它,但是编写循环或goto通常更容易且风险更低。
非递归尾调用可以启用随机分支(类似于goto其他函数的第一行),这是一种更为独特的功能。
请注意,在C ++中,return语句范围内不能有任何带有非平凡析构函数的对象。功能结束清理将要求被呼叫者返回到呼叫者,从而消除尾叫。
还要注意(以任何语言),尾部递归要求算法的整个状态在每一步都通过函数参数列表传递。(从下一个调用开始之前就必须消除函数的堆栈框架的要求中可以清楚地看出这一点……您不能将任何数据保存在局部变量中。)此外,在函数的返回值返回尾部之前,不能对其进行任何操作。
int factorial( int n, int acc = 1 ) {
if ( n == 0 ) return acc;
else return factorial( n-1, acc * n );
}
- 3 回答
- 0 关注
- 522 浏览
添加回答
举报
0/150
提交
取消