2016-10-04 10 views
-3

2回の再帰(myMaximumBy)がどのように連動しているのかわかりません。私は紙の上に図を描こうとしていますが、私は立ち往生しています。もし、X(最初の行)は、単一の要素を打つまで、例えば、myMaximumByは[3 1、5、2、4]誰かが下のコードの仕組みを説明できますか?

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は唯一の要素なので、最大値でなければなりません。

ここで、yとxの両方が一致するかどうかを確認します。yがxより大きい場合(最初の場合)はyを最大値として引き続き、それ以外の場合はx(2番目の場合)を維持します。代わりにこれを説明するために、私はmaxByを使用する場合は、WHERE句を使用して定義を使用しての

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 

この定義はあなたと同じです。

例:それはF` `への呼び出しの唯一の線形数を必要とすることを除いて

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

OPの実装はへの呼び出しの最悪の場合の指数番号を持っているのに対し、「この定義はあなたと同じです」 'f' ... –

関連する問題