0

額面と金額のリストを指定して、スキームを変更する方法の数をカウントする関数を作成しています。私のコードは次のとおりですが、意図したとおりに動作しません。+ 演算子の代わりに cons を使用する必要がありますか? 下の 3 行目の基本ケースは空のリストにする必要がありますか?

(define (change k l)
 (cond ((= k 0) 1)
     ((or (< k 0) (null? l)) 0)
     (else (+ (change k (cdr l))
              (change (- k (car l))
                      (cdr l)))))) 

テスト:

(change 11 (list 1 5 10 25))
4

1 に答える 1

2

戻り値が単なる数値の場合は出力を作成するためのconsとを忘れて、入力の処理に,のみを使用します。それ以外は、コードの最後の行に小さな間違いがあることに注意してください。修正されたバージョンは次のとおりです。'()carcdrnull?

(define (change k l)
  (cond ((= k 0) 1)
        ((or (< k 0) (null? l)) 0)
        (else
         (+ (change k (cdr l))
            (change (- k (car l)) l))))) ; don't do (cdr l) here

今では期待どおりに動作します:

(change 11 (list 1 5 10 25))
=> 4
于 2013-10-06T17:43:12.153 に答える