首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >编译器能够并是否将递归逻辑转换为等效的非递归逻辑?

编译器能够并是否将递归逻辑转换为等效的非递归逻辑?
EN

Software Engineering用户
提问于 2013-06-27 19:56:01
回答 1查看 4.5K关注 0票数 15

我一直在学习F#,它开始影响我在编写C#程序时的思维方式。为此,我一直在使用递归,当我觉得结果提高了可读性时,我无法想象它会出现堆栈溢出。

这让我不禁要问,编译器是否能够自动将递归函数转换为等效的非递归形式?

EN

回答 1

Software Engineering用户

发布于 2013-06-27 20:07:06

小心踩。

答案是肯定的,但不是总是,也不是所有的。这是一种使用几个不同名称的技术,但您可以在这里维基百科上找到一些非常明确的信息。

我更喜欢“尾叫优化”这个名字,但也有一些人会混淆这个词。

尽管如此,有几件重要的事情需要认识到:

  • 要优化尾调用,尾调用需要调用时已知的参数。这意味着,如果其中一个参数是对函数本身的调用,则不能将其转换为循环,因为这将需要任意嵌套所述循环,而在编译时不能对其进行扩展。
  • C#不能可靠地优化尾调用。IL有指令来执行F#编译器将发出的指令,但是C#编译器将不一致地发出它,并且根据JIT的情况,JIT可能会也可能不会这样做。所有迹象表明,您不应该依赖于在C#中优化的尾调用,这样做的溢出风险是巨大的和真实的。
票数 9
EN
页面原文内容由Software Engineering提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://softwareengineering.stackexchange.com/questions/202983

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档