内容简介:最好的答案是“不”.在循环和尾部递归中都有一些丑陋.虽然循环需要可变性和效果,虽然我没有任何反对使用这些适当的方式,特别是当封装在本地函数的上下文中时,有时您有时会觉得,当您开始将效果仅仅引入到循环中时,您会感觉到您的程序很混乱/ 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
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网
猜你喜欢:- 究竟什么时候该使用 MQ?
- Go语言中什么时候使用指针
- 什么时候我们不应该使用锁文件
- Django查询时候使用sql语句的方式
- 什么时候应该在ES6中使用箭头函数?
- 是时候 Get 新技能了:使用 Java 爬取网页信息
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
How Tomcat Works
Budi Kurniawan、Paul Deck / BrainySoftware / 2004-4-1 / USD 54.95
A Guide to Developing Your Own Java Servlet Container一起来看看 《How Tomcat Works》 这本书的介绍吧!