2

当我继续学习函数式编程时,我开始怀疑是否有替代我默认的“过程”思维方式的替代方案。更具体地说,我正在查看我编写的函数。这是它的作用:

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 变量的标准循环*来执行上述操作。它工作得很好,而且在现实生活中迭代肯定没有错,但是由于这个练习的目的是扩展我的思维方式,我很好奇上述算法是否有更实用的方法。

谢谢!

*(实际上是递归,但无论如何)

4

2 回答 2

1

递归基本上是一种函数式编程机制。我想你可以用一个接收列表并返回一个列表的函数替换你的交换函数或类似的愚蠢的东西,但这将是一个坏主意,除非用一种实际功能强大的语言编写。

尝试在 Oz、SML、Prolog 或 Lisp 中实现归并排序。例如像这样的用于合并的伪代码:

Merge(A,[])=A
Merge(H|T,H2|T2)=iif(H<H2,H|Merge(T,H2|T2),H2|Merge(H|T,T2)
于 2008-11-25T18:17:17.077 回答
1

EigenClass

可敬的大师勒罗瓦和他的学生一起散步。徒弟想和师父谈一谈,说:“师父,我听说所有的循环都必须用尾递归函数代替,是真的吗?” Leroy 同情地看着他的学生,回答说:“愚蠢的学生,许多尾递归函数只是效率低下的循环。”

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

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

由于我看不到您的功能以了解它的功能*,因此我不知道。但看起来你正在做的事情是正确的。我的主要建议是研究适合函数式编程的数据结构——但您使用的是列表,所以在这种情况下,列表并不是最好的数据结构。以及算法。如果您对使用插入排序一无所知,那么您可能无法使用归并排序或其他更有效的方法。

于 2008-11-25T18:21:47.053 回答