2017-10-24 16 views
0

私は数値のセットを持っています。たとえば、set = [1,3,4,5,6,7,8]です。ループを書く必要があります。これは、たとえば合計がmax = 30より小さい要素だけを選択します。条件がFalseの場合、Haskell Iterateを繰り返します。

for(int i = 0;i<set.length();i++) { total = total + set[i]; if (total <= max) return i; } 
..... 
elements are from 0 to returned index 

私は、1サイクルだけを使用してそれを再帰的にhaskellで行う方法は知られていません。

+2

"のみ1サイクル" とは何を意味するのでしょうか?あなたがリストの1つのトラバーサルを意味するならば、あなたが怠惰を利用する場合、それは必要であると確信していますか? – Carl

答えて

2

合計が大きすぎるまで要素を放出してリストを歩きます。だから、:GHCiの中

thePriceIsRight max (x:xs) | x <= max = x : thePriceIsRight (max-x) xs 
thePriceIsRight _ _ = [] 

> thePriceIsRight 30 [1,3,4,5,6,7,8] 
[1,3,4,5,6,7] 
+0

これは 'scanl'でより良いですね。 'thePriceIsRight max = takeWhile(<= max)。 scanl(+)0'となる。編集:実際には、累積合計ではなく、アイテムそのものを求めているのがわかります。さて、おそらく 'scanl'を使いにくいかもしれません。 – amalloy

関連する問題