/* ;First homework exercise: ;Based on the definitions below of count-change, cc, and next, ;draw a tree showing the tree recursive calls of cc ;in execution of (count-change 26). ;What would the difference be for the call (count-change 27)? ; submit this homework on paper. */ long count_change(int n); long cc(int n, int largest_coin); int next(int c); // memoization system #include using namespace std; typedef pair args; map M; long setmemo(int n, int coin, long ans) { M[args(n, coin)] = ans; return ans; } bool getmemo(int n, int coin, long& ans) { return ans = M[args(n, coin)]; } /* (define (count-change n) ; return the number of different ways to make change of n cents. (cc n 50)) */ long count_change(int n) { return cc(n, 50); } /* (define (cc n largest-coin) ; return the number of different ways to make change of n cents ; using no coins larger in amount than largest-coin. (cond ((zero? n) 1) ((= largest-coin 1) 1) ((< n largest-coin) (cc n (next largest-coin))) (else (+ (cc n (next largest-coin)) (cc (- n largest-coin) largest-coin))) )) */ long cc(int n, int largest_coin) { long ans; if (n == 0) return 1; if (largest_coin == 1) return 1; if (0 != getmemo(n, largest_coin, ans)) return ans; else if (n < largest_coin) return setmemo(n, largest_coin, cc(n, next(largest_coin))); else return setmemo(n, largest_coin, cc(n, next(largest_coin)) // no use of largest + cc(n-largest_coin, largest_coin) // at least one use of largest ); } /* (define (next coin) (cond ((= coin 50) 25) ((= coin 25) 10) ((= coin 10) 5) ((= coin 5) 1) (else (error "next: unrecognized coin" coin)) )) */ #include int next(int c) { switch(c) { case 50: return 25; case 25: return 10; case 10: return 5; case 5: return 1; default: cerr << "next: no next coin for " << c << endl; } return -1; // error } int main() { cout << 5 << " " << count_change(5) << endl; cout << 6 << " " << count_change(6) << endl; cout << 10 << " " << count_change(10) << endl; cout << 23 << " " << count_change(23) << endl; cout << 230 << " " << count_change(230) << endl; cout << 2304 << " " << count_change(2304) << endl; cout << 23045 << " " << count_change(23045) << endl; cout << 230456 << " " << count_change(230456) << endl; }