natknąłem się na następujące rozwiązanie problemu DP counting change:zmiana Liczenie w 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)
on prowadził wiele szybciej niż mój naiwny odgórne rozwiązania rekurencyjnego, a ja wciąż staram się go zrozumieć.
Otrzymuję, że biorąc pod uwagę listę monet, aux
oblicza każde rozwiązanie dla dodatnich liczb całkowitych. Dlatego rozwiązaniem dla kwoty jest indeksowanie listy na tej pozycji.
Jestem jednak mniej czytelny na temat addCoin
. W jakiś sposób wykorzystuje wartość każdej monety do narysowania elementów z listy monet? Staram się znaleźć dla niego intuicyjne znaczenie.
Fałda aux
wiąże również mój mózg w węzłach. Dlaczego 1:repeat 0
jest wartością początkową? Co to reprezentuje?
Dzięki za jasną i szczegółową odpowiedź! – user1953221