在F#中或尾递归时,什么时候使用?

栏目: ASP.NET · 发布时间: 7年前

内容简介:最好的答案是“不”.在循环和尾部递归中都有一些丑陋.虽然循环需要可变性和效果,虽然我没有任何反对使用这些适当的方式,特别是当封装在本地函数的上下文中时,有时您有时会觉得,当您开始将效果仅仅引入到循环中时,您会感觉到您的程序很混乱/ uglify .

好的,只有在F#,这是我现在理解的:

>一些问题本质上是递归的(构建或读出一个结构,只列出一个),然后使用递归.在这些情况下,您最好使用尾递归来给堆栈中断

>有些语言是纯功能的,所以你必须使用递归代替while循环,即使问题本身不是递归的

所以我的问题:由于F#也支持命令式的范例,你会在F#中使用尾递归不是自然递归的问题吗?特别是因为我已经阅读了编译器recongnizes尾递归,只是转换它在一个while循环呢?

如果是的话:为什么?

最好的答案是“不”.

在循环和尾部递归中都有一些丑陋.

虽然循环需要可变性和效果,虽然我没有任何反对使用这些适当的方式,特别是当封装在本地函数的上下文中时,有时您有时会觉得,当您开始将效果仅仅引入到循环中时,您会感觉到您的程序很混乱/ uglify .

尾递归通常具有要求额外的累加器参数或延续传递风格的缺点.这个程序与额外的样板相结合来按摩功能的启动条件.

最好的答案是既不使用循环也不使用递归.高阶功能和羊羔是你这里的救星,特别是地图和折叠.为什么愚弄周围的混乱的控制结构循环,当你可以将这些封装在可重用的库中,然后简单地声明性地陈述你的计算的本质?

如果您习惯于经常调用map / fold而不是使用循环/递归,以及提供折叠功能以及您介绍的任何新的树结构数据类型,您将会走得很远.

对于那些有兴趣了解更多关于F#的折叠的人,为什么不查看我的 first three blog 系列文章中的主题?

http://stackoverflow.com/questions/1797241/while-or-tail-recursion-in-f-what-to-use-when


以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Algorithm Design

Algorithm Design

Jon Kleinberg、Éva Tardos / Addison-Wesley / 2005-3-26 / USD 144.20

Algorithm Design introduces algorithms by looking at the real-world problems that motivate them. The book teaches students a range of design and analysis techniques for problems that arise in compu......一起来看看 《Algorithm Design》 这本书的介绍吧!

MD5 加密
MD5 加密

MD5 加密工具

HEX CMYK 转换工具
HEX CMYK 转换工具

HEX CMYK 互转工具

HEX HSV 转换工具
HEX HSV 转换工具

HEX HSV 互换工具