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
を返します?
:
purse(x):
for bill in [200, 100, 50, 20, 10, 5, 2, 1]:
if x/bill >= 1:
return [x // bill] + purse(x % bill)
'mapAccumL'ソリューション岩それが、私は再帰的な1を理解するために良かったと思います。なぜ両方を提示しないのですか? – leftaroundabout