Search code examples
recursionschemecountingcons

Counting Change in Scheme using a list of denominations


I am writing a function to count the number of ways to make change in scheme given a list of denominations and an amount. My code is as follows, but it does not work as intended. Should I be using cons instead of the + operator? Should the third line down's base case be the empty list?

(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)))))) 

Test:

(change 11 (list 1 5 10 25))

Solution

  • If the returned value is just a number then forget about cons and '() for building the output, and only use car, cdr, null? for processing the input. Other than that, be aware that there's a small mistake in the last line of your code, here's the fixed version:

    (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
    

    Now it works as expected:

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