---
layout: default
---
> [Exercise 1.10](https://mitpress.mit.edu/sites/default/files/sicp/full-text/book/book-Z-H-11.html#%_thm_1.10). The following procedure computes a mathematical function called Ackermann's function.
>
```scheme
> (define (A x y)
> (cond ((= y 0) 0)
> ((= x 0) (* 2 y))
> ((= y 1) 2)
> (else (A (- x 1)
> (A x (- y 1))))))
```
>
> What are the values of the following expressions?
>
```scheme
> (A 1 10)
>
> (A 2 4)
>
> (A 3 3)
```
>
> Consider the following procedures, where A is the procedure defined above:
>
```scheme
> (define (f n) (A 0 n))
>
> (define (g n) (A 1 n))
>
> (define (h n) (A 2 n))
>
> (define (k n) (* 5 n n))
```
>
> Give concise mathematical definitions for the functions computed by the procedures f, g, and h for positive integer values of n. For example, (k n) computes 5n2.
### (A 1 10)
```scheme
(A 1 10)
= (A 0 (A 1 9))
= (A 0 (A 0 (A 1 8)))
= (A 0 (A 0 (A 0 (A 1 7))))
... this will continue on until
= (A 0 (A 0 (A 0 (A 0 (A 0 (A 0 (A 0 (A 0 (A 0 (A 1 1))))))))))
```
Since `(A 1 1)` is 2 (from the third line of the `cond`), this is `(A 0 (A 0 (A 0 (A 0 (A 0 (A 0 (A 0 (A 0 (A 0 2)))))))))`.
Then each of those instances of `(A 0 y)` evaluate to `(* 2 y)` and the result is 210.
We can see that `(A 1 n)` is 2`n`, for any positive integer `n` (see the procedure `g` below). We will use this in calculating `(A 2 4)` below.
### (A 2 4)
```scheme
(A 2 4)
= (A 1 (A 2 3))
= (A 1 (A 1 (A 2 2)))
= (A 1 (A 1 (A 1 (A 2 1))))
= (A 1 (A 1 (A 1 2))) ; using the third line of the `cond`
= (A 1 (A 1 4)) ; using the general result from the previous example
= (A 1 16) ; again using the general result from the previous example
```
which is 216, once more using the general result from the previous example.
### (A 3 3)
```scheme
(A 3 3)
= (A 2 (A 3 2))
= (A 2 (A 2 (A 3 1)))
= (A 2 (A 2 2))
= (A 2 (A 1 (A 2 1)))
= (A 2 (A 1 2))
= (A 2 4)
```
This is the same as the previous example, 216.
### (define (f n) (A 0 n))
`(f n)` = `(A 0 n)` = `(* 2 n)` for any positive integer `n`.
### (define (g n) (A 1 n))
See the expansion of `(A 1 10)` above. `(g n)` is `(A 1 n)`, which is 2`n`, for any positive integer `n`.
### (define (h n) (A 2 n))
`(h n) = (A 2 n) = (A 1 (A 2 (- n 1)))`.
This is the same as `(g (A 2 (- n 1)))`, or `(g (h (- n 1)))`.
Another way to write this is 2`(h (- n 1))`.
This is 2 to the power of 2 to the power of 2 to the power of... 2, with a total of `n` - 1 twos.