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

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

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


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

查看所有标签

猜你喜欢:

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

疯狂Java讲义

疯狂Java讲义

李刚 / 电子工业出版社 / 2008-10 / 99.00元

《疯狂Java讲义》2000年至今,Java语言一直是应用最广的开发语言,并拥有最广泛的开发人群。如今,Java已经不再简单地是一门语言,它更像一个完整的体系,一个系统的开发平台。更甚至,它被延伸成一种开源精神。 《疯狂Java讲义》深入介绍了Java编程的相关方面,全书内容覆盖了Java的基本语法结构、Java的面向对象特征、Java集合框架体系、Java泛型、异常处理、Java GUI编......一起来看看 《疯狂Java讲义》 这本书的介绍吧!

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

在线压缩/解压 JS 代码

RGB转16进制工具
RGB转16进制工具

RGB HEX 互转工具

MD5 加密
MD5 加密

MD5 加密工具