fork download
  1. ; catalan numbers
  2.  
  3. (define (choose n k)
  4. (if (zero? k) 1
  5. (* n (/ k) (choose (- n 1) (- k 1)))))
  6.  
  7. (define (catalan n)
  8. (if (zero? n) 1
  9. (- (choose (+ n n) n) (choose (+ n n) (- n 1)))))
  10.  
  11. (do ((i 0 (+ i 1))) ((< 30 i))
  12. (display i) (display #\tab)
  13. (display (catalan i)) (newline))
  14.  
  15. (define-syntax define-memoized
  16. (syntax-rules ()
  17. ((define-memoized (f arg ...) body ...)
  18. (define f
  19. (let ((cache (list)))
  20. (lambda (arg ...)
  21. (cond ((assoc `(,arg ...) cache) => cdr)
  22. (else (let ((val (begin body ...)))
  23. (set! cache (cons (cons `(,arg ...) val) cache))
  24. val)))))))))
  25.  
  26. (define-memoized (catalan n)
  27. (if (zero? n) 1
  28. (let loop ((i 1) (count 0))
  29. (if (< n i) count
  30. (loop (+ i 1) (+ count (* (catalan (- i 1))
  31. (catalan (- n i)))))))))
  32.  
  33. (do ((i 0 (+ i 1))) ((< 30 i))
  34. (display i) (display #\tab)
  35. (display (catalan i)) (newline))
Success #stdin #stdout 0.02s 43152KB
stdin
Standard input is empty
stdout
0	1
1	1
2	2
3	5
4	14
5	42
6	132
7	429
8	1430
9	4862
10	16796
11	58786
12	208012
13	742900
14	2674440
15	9694845
16	35357670
17	129644790
18	477638700
19	1767263190
20	6564120420
21	24466267020
22	91482563640
23	343059613650
24	1289904147324
25	4861946401452
26	18367353072152
27	69533550916004
28	263747951750360
29	1002242216651368
30	3814986502092304
0	1
1	1
2	2
3	5
4	14
5	42
6	132
7	429
8	1430
9	4862
10	16796
11	58786
12	208012
13	742900
14	2674440
15	9694845
16	35357670
17	129644790
18	477638700
19	1767263190
20	6564120420
21	24466267020
22	91482563640
23	343059613650
24	1289904147324
25	4861946401452
26	18367353072152
27	69533550916004
28	263747951750360
29	1002242216651368
30	3814986502092304