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

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

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


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

查看所有标签

猜你喜欢:

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

算法概论

算法概论

Sanjoy Dasgupta、Christos Papadimitriou、Umesh Vazirani / 王沛、唐扬斌、刘齐军 / 清华大学出版社 / 2008-7 / 39.99元

《国外经典教材·算法概论》涵盖了绝大多数算法设计中的常用技术。在表达每一种技术时,阐述它的应用背景,强调每个算法运转背后的简洁数学思想,注意运用与其他技术类比的方法来说明它的特征,并提供了大量相应实际问题的例子。《国外经典教材·算法概论》同时也注重了对每一种算法的复杂性分析。全书共10章,从基本的数字算法人手,先后介绍了分治、图的遍历、贪心算法、动态规划、线性规划等技术,对NP完全问题进行厂基本而......一起来看看 《算法概论》 这本书的介绍吧!

CSS 压缩/解压工具
CSS 压缩/解压工具

在线压缩/解压 CSS 代码

HTML 编码/解码
HTML 编码/解码

HTML 编码/解码

HSV CMYK 转换工具
HSV CMYK 转换工具

HSV CMYK互换工具