当我继续学习函数式编程时,我来了 想知道是否可能有我的默认“程序”方式的替代品 思考。更具体地说,我正在研究一个函数I. 中写道。这是它的作用:
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变量的标准循环* 以上。它工作正常,而且一切都没有错 在现实生活中迭代,但这个练习的重点是 扩展我的思维方式,我很好奇是否有更多功能 接近上述算法。
谢谢!
*(实际递归,但无论如何)
答案 0 :(得分:1)
递归基本上是一种函数式编程机制。我猜你可以用一个接受列表并返回列表或类似傻事的函数来替换你的交换函数,但除非用实际功能的语言编写,否则这将是一个坏主意。
尝试在Oz,SML,Prolog或Lisp中实现mergesort。例如。像这个用于合并的伪代码:
Merge(A,[])=A
Merge(H|T,H2|T2)=iif(H<H2,H|Merge(T,H2|T2),H2|Merge(H|T,T2)
答案 1 :(得分:1)
来自EigenClass:
尊敬的大师勒罗伊和他的学生一起走路。希望与他的主人开始讨论,学徒说:“主人,我听说必须用尾递归函数替换所有循环。这是真的吗?” Leroy怜悯地看着他的学生回答“愚蠢的学生,很多尾递归函数只是效率低下的循环。”
学生在接下来的几周里用显式循环替换了尾递归函数。他终于展示了他的代码来掌握Leroy,寻求他的同意。 Leroy用棍子打他。 “你什么时候学习?明确的循环是一个穷人的尾递归函数。”那一刻,学生开悟了。
编辑:参考OCaml的主要开发人员Xavier Leroy
因为我不能看你的功能来理解它的功能*,我不知道。但看起来你正在做的事情是正确的。我的主要建议是查看能够很好地适应函数式编程的数据结构 - 但是你使用的是列表,所以尽管如此,列表并不是这种情况下最好的数据结构。以及算法。如果您使用插入排序,那么您可能无法使用合并排序或其他更有效的方法。