我希望看到尾递归优化的影响,并希望以尾递归优化方式编写简单的阶乘函数。 是否有可能在没有编译器支持的代码中执行此操作?C++代码中的尾递归优化
回答
编译器进行优化。所以没有编译器支持就无法测试它。
在代码中执行此操作的唯一方法是通过迭代替换递归(但当然,您将失去递归)。
尾递归优化将带尾递归属性的函数转换为迭代,为了在没有编译器支持的情况下执行它,您必须手动执行递归 - >迭代。请注意,您可能会丢失代码的可读性(递归函数往往更短,更容易理解),并需要大量代码更改(从而将您的大脑翻转出去)。如果我需要这样做,我通常会将原始递归函数放在转换迭代版本之上的注释中。
*因此把你的大脑翻出来*这是一个很好的练习:) –
也可以写一个迭代版本,使它看起来尽可能的像递归版本一样,因此可以很容易理解。基本上在函数顶部放置一个标签或'while(1)'。用每个函数参数一行代替每个尾递归调用'return myfunc(arg1,arg2 ... arg_n);'来设置新的值(如果它不同于当前值),接着是'goto'或'continue '。如果函数不是简单的尾递归,则需要更多的更改,但如果编译器仅优化简单的尾递归,则需要进行相同的更改。 –
- 1. 在C++中优化递归
- 2. C++ 11是否优化了lambdas中的尾递归调用?
- 3. 优化非尾递归函数
- 4. 斯卡拉尾递归优化
- 5. Memoizing尾调用优化递归函数
- 6. Go递归函数调用尾优化?
- 7. PHP是否优化尾递归?
- 8. 递归迭代 - 或优化?
- 9. 优化通状态(尾递归优化)过境时
- 10. 递归优化?
- 11. 递归优化
- 12. C中的尾递归?
- 13. 尾部递归之外的尾部调用优化?
- 14. 对C语言中的代码应用尾递归?
- 15. 为什么尾递归优化比Python中的正常递归更快?
- 16. 递归练习中更优化的代码
- 17. 优化C++代码
- 18. 优化C代码
- 19. 优化C代码
- 20. 优化C++代码
- 21. C#代码优化
- 22. C++代码优化
- 23. C代码优化
- 24. C#优化代码
- 25. 优化C代码
- 26. 部分尾递归函数是否仍然可以获得完全尾递归函数的优化优势?
- 27. Scheme中的递归函数总是进行尾调优化?
- 28. Rfactor这个F#代码到尾递归
- 29. 递归,尾递归和迭代
- 30. 在C和Haskell之间的相互递归中编译尾部调用优化
谢谢。那么支持尾递归优化的编译器会自动将普通阶乘函数转换为交互函数,还是我们需要手动提供该函数?例如,Factorial上的尾递归版本将具有Factorial(value,accu)函数(http://stackoverflow.com/questions/310974/what-is-tail-call-optimization)。基本上,编译器会自动完成它,还是需要编译器以这种方式对编译器进行优化?谢谢。 – madu
@madu g ++自动执行尾递归优化;你不必改变你编写代码的方式(至少在像factorial这样的简单情况下)。但是,所有编译器都不是这样。 –