在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


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

查看所有标签

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

免费

免费

克里斯•安德森 / 蒋旭峰、冯斌、璩静 / 中信出版社 / 2012-10 / 68.00元

一种商业模式既可以统摄未来的市场,也可以挤垮当前的市场——在我们这个现代经济社会里,这并不是一件不可能的事情。 “免费”就是这样的一种商业模式,它所代表的正是数字化网络时代的商业未来。 在《免费》这本书中,克里斯•安德森认为,新型的“免费”并不是一种左口袋出、右口袋进的营销伎俩,而是一种把货物和服务的成本压低到零的新型卓越能力。在20世纪“免费”是一种强有力的推销手段,而在21世纪它已经成为......一起来看看 《免费》 这本书的介绍吧!

JS 压缩/解压工具
JS 压缩/解压工具

在线压缩/解压 JS 代码

SHA 加密
SHA 加密

SHA 加密工具

Markdown 在线编辑器
Markdown 在线编辑器

Markdown 在线编辑器