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