2008-11-25 174 views
2

随着我继续学习函数式编程的探索,我来到 想知道是否可以替代我的默认“程序”方式 的想法。更具体地说,我正在寻找一个函数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变量做 以上。它工作正常,所有的,并没有什么不对与现实生活中的迭代,但作为这个练习的重点是 扩大我的思维方式,我很好奇,如果有更多的功能 方法来上述算法。

谢谢!

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

回答

1

EigenClass

上人乐华与他的学生走。希望与他的主人开始讨论,学徒说:“师父,我听说所有的循环都必须用尾递归函数代替,这是真的吗?” Leroy愤怒地看着他的学生回答说:“愚蠢的学生,许多尾递归函数只是低效的循环。”

该学生花了几个星期用显式循环替换尾递归函数。他终于展示了自己的代码,以便掌握Leroy,并获得他的批准。 Leroy用棍子打他。 “你什么时候学习?显式循环是一个穷人的尾递归函数。”那一刻,学生开悟了。

编辑:参照泽维尔乐华,OCaml的

的主要开发者既然不能看到你的函数去了解它是如何的功能*,我不知道。但似乎你所做的是正确的。我的主要建议是查看可以很好地适用于函数式编程的数据结构 - 但是您正在使用列表,所以这已经结束了,尽管在这种情况下列表并不是最好的数据结构。以及算法。如果你是使用插入排序的鸽子,那么你可能无法使用合并排序或其他更有效的方法。

+0

谢谢你的启发;)我知道这个算法有点傻,其目的不在于将清单分类以确定这样做的“成本”(成本定义为所需交换的最小总和)。 – 2008-11-25 18:35:01

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) 
+0

我实际上使用Clojure,它具有不可变数据结构的功能,所以我的交换功能不需要列表并返回一个。就像我说的,我的问题主要是学术问题,看看我是否错过了一些简洁的电话,以减少或映射什么。 – 2008-11-25 18:32:38