stieß ich auf die folgende Lösung für das Problem der DP counting change:Counting Änderung in Haskell
count' :: Int -> [Int] -> Int
count' cents coins = aux coins !! cents
where aux = foldr addCoin (1:repeat 0)
where addCoin c oldlist = newlist
where newlist = (take c oldlist) ++ zipWith (+) newlist (drop c oldlist)
Es lief viel schneller als meine naive Top-down-rekursive Lösung, und ich bin immer noch versuchen, es zu verstehen.
Ich bekomme, dass eine Liste von Münzen gegeben, aux
berechnet jede Lösung für die positiven ganzen Zahlen. Daher besteht die Lösung für einen Betrag darin, die Liste an dieser Position zu indizieren.
Ich bin weniger klar auf addCoin
, obwohl. Es benutzt irgendwie den Wert jeder Münze, um Elemente aus der Münzliste zu zeichnen? Ich kämpfe darum, eine intuitive Bedeutung dafür zu finden.
Die Falte in aux
bindet auch mein Gehirn in Knoten. Warum ist 1:repeat 0
der Anfangswert? Was stellt es dar?
Danke für die klare und detaillierte Antwort! – user1953221