2016-12-15 3 views
2

このコードでは、合計金額をIntとし、その合計額に必要な最小限の請求書またはコインを示すタプルのリストを返します。警備員のこのシリーズは因数分解/除去することができる機能は、単にwhere bills = [200, 100, 50, 20...]のように、請求書/コインのリストに基づいて動作します:ハスケルのファクタリングガード

[("$10", 1), ("$5", 1), ("$2", 1), ("$1", 1)] 

私の質問は次のとおりです。たとえば

purse :: Int -> [(String, Int)] 
purse x 
    | x == 0  = [("$0", 0)] 
    | div x 200 >= 1 = before x 200 : after x 200 
    | div x 100 >= 1 = before x 100 : after x 100 
    | div x 50 >= 1 = before x 50 : after x 50 
    | div x 20 >= 1 = before x 20 : after x 20 
    | div x 10 >= 1 = before x 10 : after x 10 
    | div x 5 >= 1 = before x 5 : after x 5 
    | div x 2 >= 1 = before x 2 : after x 2 
    | div x 1 >= 1 = before x 1 : after x 1 
    where before x y = ("$" ++ show x, div x y) 
     after x y = if mod x y > 0 
         then purse (mod x y) 
         else [] 

purse 18を返します?

私のようなものだろう(ない正確な作業溶液をしかし、あなたのアイデアを得る)Pythonで

purse(x): 
    for bill in [200, 100, 50, 20, 10, 5, 2, 1]: 
     if x/bill >= 1: 
      return [x // bill] + purse(x % bill) 

答えて

5
purse = go [200,100,50,20,10,5,2,1] where 
    go (c:cs) x | x < c = go cs x 
    go (c:cs) x = ("$" ++ show c, div x c) : go cs (mod x c) 
    go [] _ = [] 

purse x = filter ((>0) . snd) $ snd $ mapAccumL foo x [200,100,50,20,10,5,2,1] 
    where foo x c = (mod x c, ("$" ++ show c, div x c)) 
+1

'mapAccumL'ソリューション岩それが、私は再帰的な1を理解するために良かったと思います。なぜ両方を提示しないのですか? – leftaroundabout