2016-10-04 43 views
-3

我無法弄清楚如何兩個遞歸(myMaximumBy)一起工作,我試圖在紙上繪製圖表,但我卡住了。例如,myMaximumBy比較[1,5,2,4,3]有人可以解釋下面的代碼是如何工作的嗎?

myMaximumBy :: (a -> a -> Ordering) -> [a] -> a 
myMaximumBy _ (x:[]) = x 
myMaximumBy f (x:xs) = if (f x (myMaximumBy f xs)) == GT then x else (myMaximumBy f xs) 

回答

2

基本上你遍歷整個列表,直到命中一個單一的元素,X(第一行)。由於x是唯一的元素,它必須是最大值。

現在你回頭檢查y對x的每一個元素:如果y大於x(第一種情況),那麼你繼續y作爲最大值,否則保留x(第二種情況)。

而不是使用您的定義與if從句我會用maxBy來說明這一點:

maximumBy f [x] = x 
maximumBy f (x:xs) = maxBy f x (maximumBy f xs) 

maxBy f x y | f x y == GT = x 
      | otherwise = y 

這個定義等同於你的。

例子:

maximumBy (comparing abs) [2,5,-3,1] 
== maxBy (comparing abs) 2 (maxBy (comparing abs) 5 (maxBy (comparing abs) -3 (maximumBy (comparing abs) [1]))) 
== maxBy (comparing abs) 2 (maxBy (comparing abs) 5 (maxBy (comparing abs) -3 1)) 
== maxBy (comparing abs) 2 (maxBy (comparing abs) 5 -3) 
== maxBy (comparing abs) 2 5 
== 5 
+0

「這個定義等同於你的」,不同的是它僅需要調用'F'的線性數,而OP的實現具有調用的最壞情況的指數數'F' ... –

相關問題