2011-10-05 170 views
0

我希望看到尾递归优化的影响,并希望以尾递归优化方式编写简单的阶乘函数。 是否有可能在没有编译器支持的代码中执行此操作?C++代码中的尾递归优化

回答

3

编译器进行优化。所以没有编译器支持就无法测试它。

在代码中执行此操作的唯一方法是通过迭代替换递归(但当然,您将失去递归)。

+0

谢谢。那么支持尾递归优化的编译器会自动将普通阶乘函数转换为交互函数,还是我们需要手动提供该函数?例如,Factorial上的尾递归版本将具有Factorial(value,accu)函数(http://stackoverflow.com/questions/310974/what-is-tail-call-optimization)。基本上,编译器会自动完成它,还是需要编译器以这种方式对编译器进行优化?谢谢。 – madu

+0

@madu g ++自动执行尾递归优化;你不必改变你编写代码的方式(至少在像factorial这样的简单情况下)。但是,所有编译器都不是这样。 –

2

尾递归优化将带尾递归属性的函数转换为迭代,为了在没有编译器支持的情况下执行它,您必须手动执行递归 - >迭代。请注意,您可能会丢失代码的可读性(递归函数往往更短,更容易理解),并需要大量代码更改(从而将您的大脑翻转出去)。如果我需要这样做,我通常会将原始递归函数放在转换迭代版本之上的注释中。

+1

*因此把你的大脑翻出来*这是一个很好的练习:) –

+0

也可以写一个迭代版本,使它看起来尽可能的像递归版本一样,因此可以很容易理解。基本上在函数顶部放置一个标签或'while(1)'。用每个函数参数一行代替每个尾递归调用'return myfunc(arg1,arg2 ... arg_n);'来设置新的值(如果它不同于当前值),接着是'goto'或'continue '。如果函数不是简单的尾递归,则需要更多的更改,但如果编译器仅优化简单的尾递归,则需要进行相同的更改。 –