首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >函数式替代?

函数式替代?
EN

Stack Overflow用户
提问于 2008-11-25 17:07:58
回答 2查看 356关注 0票数 2

随着我继续学习函数式编程,我开始怀疑是否有替代我默认的“过程式”思维方式的方法。更具体地说,我正在查看我编写的一个函数。下面是它的功能:

代码语言:javascript
复制
Swap two elements of an unordered list of numbers, such that one of the elements  
 is now in the right place
Add the sum of the swapped values to an accumulated total   
Repeat until list is sorted

所以,现在我使用一个标准的循环*和一个accum变量来做上面的事情。它工作得很好,在现实生活中迭代当然没有错,但由于本练习的目的是扩展我的思维方式,我很好奇上面的算法是否有更好的方法。

谢谢!

*(实际上是递归,但不管怎样)

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2008-11-25 18:21:47

来自EigenClass

德高望重的勒罗伊大师和他的学生一起走着。学徒希望和他的师父开始讨论,他说:“师父,我听说所有的循环都必须用尾递归函数代替,这是真的吗?”勒罗伊同情地看着他的学生,回答说:“愚蠢的学生,许多尾递归函数只不过是低效的循环。”

学生在接下来的几周里用显式循环替换了尾递归函数。最后,他向勒罗伊大师展示了他的代码,寻求他的认可。勒罗伊用棍子打了他。“你什么时候才能学会?显式循环是穷人的尾递归函数。”就在那一刻,这个学生变得开悟了。

编辑:参考OCaml的主要开发人员Xavier Leroy

因为我看不到你的函数来理解它的功能,所以我不知道。但是看起来你所做的是正确的。我的主要建议是考虑适合函数式编程的数据结构--但是您使用的是列表,所以这是不可能的,尽管在这种情况下,列表不是最好的数据结构。以及算法。如果您坚持使用插入排序,那么您可能无法使用合并排序或其他更有效的方法。

票数 1
EN

Stack Overflow用户

发布于 2008-11-25 18:17:17

递归基本上是一种函数式编程机制。我猜你可以用一个接受列表并返回一个列表的函数来替换你的交换函数,但是除非用一种真正的函数式语言来编写,否则这不是一个好主意。

尝试在Oz、SML、Prolog或Lisp中实现mergesort。例如,merge的伪代码如下:

代码语言:javascript
复制
Merge(A,[])=A
Merge(H|T,H2|T2)=iif(H<H2,H|Merge(T,H2|T2),H2|Merge(H|T,T2)
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/318128

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档