Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #lang racket
- ;; 1.9
- (define (inc x) (add1 x))
- (define (dec x) (sub1 x))
- ;; plus is recursive but not tail recursive hence not iterative
- (define (plus a b)
- (if (zero? a)
- b
- (inc (plus (dec a) b))))
- ;; (plus 4 5)
- ;; (inc (plus 3 5))
- ;; (inc (inc (plus 2 5)))
- ;; (inc (inc (inc (plus 1 5))))
- ;; (inc (inc (inc (inc (plus 0 5)))))
- ;; (inc (inc (inc (inc 5))))
- ;; (inc (inc (inc 6)))
- ;; (inc (inc 7))
- ;; (inc 8)
- ;; 9
- ;; new-plus is tail recursive hence iterative
- (define (new-plus a b)
- (if (zero? a)
- b
- (new-plus (dec a) (inc b))))
- ;; (new-plus 4 5)
- ;; (new-plus 3 6)
- ;; (new-plus 2 7)
- ;; (new-plus 1 8)
- ;; (new-plus 0 9)
- ;; 9
- ;; 1.10
- ;; Ackermann function a very fast-growing recursive function
- (define (A x y)
- (cond [(zero? y) 0]
- [(zero? x) (* 2 y)]
- [(= y 1) 2]
- [else (A (sub1 x)
- (A x (sub1 y)))]))
- (A 1 10)
- ;; 1024
- (A 2 4)
- ;; 65536
- (A 3 3)
- ;; 65536
- (define (f n) (A 0 n))
- ;; f(n) = 2 * n by definition
- (f 0)
- ;; 0
- (f 1)
- ;; 2
- (f 2)
- ;; 4
- (define (g n) (A 1 n))
- ;; g(n) = 2 ^ n for n > 0 because
- ;; g(1) = A(1, 1) = 2 by definition and
- ;; g(n) = A(1, n)
- ;; = A(0, A(1, n - 1))
- ;; = f(A(1, n - 1))
- ;; = 2 * A(1, n - 1)
- ;; = 2 * g(n - 1)
- (g 0)
- ;; 0
- (g 1)
- ;; 2
- (g 2)
- ;; 4
- (g 3)
- ;; 8
- (g 4)
- ;; 16
- (g 5)
- ;; 32
- (define (h n) (A 2 n))
- ;; h(n) = an exponentiation tower of n 2's for n > 0 because
- ;; h(1) = A(2, 1) = 2 by definition and
- ;; h(n) = A(2, n)
- ;; = A(1, A(2, n - 1))
- ;; = g(A(2, n - 1))
- ;; = 2 ^ A(2, n - 1)
- ;; = 2 ^ h(n - 1)
- (h 0)
- ;; 0
- (h 1)
- ;; 2
- (h 2)
- ;; 4
- (h 3)
- ;; 16
- (h 4)
- ;; 65536 ; 2 ^ 16
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement