2

コインチェンジの問題を解決しようとしています:

数値 k のリストが与えられた場合、与えられた量 m に変更を加える方法はいくつありますか。

リソースの 1 つとして、次の疑似コードがあります。

 (define (count-change amount)
  (cc amount 5))
(define (cc amount kinds-of-coins)
  (cond ((= amount 0) 1)
        ((or (< amount 0) (= kinds-of-coins 0)) 0)
        (else (+ (cc amount
                     (- kinds-of-coins 1))
                 (cc (- amount
                        (first-denomination kinds-of-coins))
                     kinds-of-coins)))))
(define (first-denomination kinds-of-coins)
  (cond ((= kinds-of-coins 1) 1)
        ((= kinds-of-coins 2) 5)
        ((= kinds-of-coins 3) 10)
        ((= kinds-of-coins 4) 25)
        ((= kinds-of-coins 5) 50)))

しかし、私はこの疑似コードを理解していません。算術記号が後ろにあるはずのときに、前に算術記号があります。else文が始まるところまでは理解できました。しかし、else ループに入ると、何が起こっているのかわかりません。この疑似コードを、else 句の後の各ステップで実行するいくつかの論理的な処理に減らしていただけますか?

または、この問題を解決するために、この疑似コードよりも役立つ記事はありますか。これをグーグルで検索すると、最適な変更を求める問題しか見つかりませんが、それは必要ありません。

これはコーセラ コースであり、直接の回答は倫理規定に違反するため、コードを教えないでください。

UPDATE @EmilVikströmが親切にそこで何が起こっているのかを親切に説明してくれたので、スキームと同じはずの小さな疑似コードを作成しようとしました(これはelse句にすぎません。残りはかなり自明です自分)。

else
  cc ( amount - kindOfCoins.head , kindOfCoins) + cc ( amount , kindOfCoins.tail )

これは策略の結果でしょうか。そうでない場合、どこで間違ったのですか?これはコーセラの倫理規定に違反するため、もう一度答えないでください(できれば正しい方向に向けてください)。

4

1 に答える 1