2017-10-24 5 views
0

ハスケルでは、整数のリストを受け取って2つの隣接する数値の最大の積を返す関数を持つ必要がある問題を解決しようとしています。再帰関数中の値を保持する

例:[5,6,1,3,9]が30を返すであろう、それは5の生成物と6

ある関数fの種類がこのようなものであろう:

f :: [Int] -> Int 

私は、このようなパターンで2つのヘッド要素を得るリストを反復するために再帰を使用して解決することを考えました:(x1:x2:xs) 問題は、現在の製品が最後のものよりも大きい場合に比較する製品の値を保持する方法がわかりません製品。

アイデア?

+0

空リストの場合はどうなりますか?または1つの要素を持つリスト? –

+2

隣接する数字のすべての組でリストを作成する方法を考えてもいいですか?f [5,6,1,3,9] == [(5,6)、(6,1)、(1,3) )、(3,9)] '? – Ryan

+0

もう一つの可能​​性は、中間結果(あなたの現在の最大値)として使用される追加の引数を持つ再帰ヘルパー関数 'go'を作ることでしょう。問題:初期値を見つけなければならない。したがって、あなたの関数と中間結果の戻り値の型を 'Maybe Int'に変更することを検討してください。 – mschmidt

答えて

5

ハスケルリストは怠惰なので、効率を落とすことなく明示的に最大値を保持するのではなく、リストベースの方法を使ってこの問題を解決できます。元のリストから開始:

> let f x = x 
> f [5,6,1,3,9] 
[5,6,1,3,9] 

zipのpingによる左シフトリストとリスト全体をペアのリストを得る:

> let f x = zip x (tail x) 
> f [5,6,1,3,9] 
[(5,6),(6,1),(1,3),(3,9)] 

代わりにペアの製品を取得するには、関連する機能zipWithを使用します。

> let f x = zipWith (*) x (tail x) 
> f [5,6,1,3,9] 
[30,6,3,27] 

と、そのリストからmaximumを取得:

> let f x = maximum (zipWith (*) x (tail x)) 
> f [5,6,1,3,9] 
30