# SICP - Solution: Exercise 1.41

## Oct 29, 2018 06:04 · 202 words · 1 minute read

**Exercise 1.41:** Define a procedure `double`

that takes a procedure of one argument as argument and returns a procedure that applies the original procedure twice. For example, if `inc`

is a procedure that adds 1 to its argument, then `(double inc)`

should be a procedure that adds 2. What value is returned by

```
(((double (double double)) inc) 5)
```

**Solution**

The definition of `double`

is a function that takes a function as parameter and returns a function that apply it twice:

```
(define (double f)
(lambda (x)
(f (f x))))
```

Now, lets break `(((double (double double)) inc) 5)`

step by step. `(double double)`

is a procedure that return a procedure that applies its parameter four times:

```
((double f) x)→ (f (f x))
(((double double) f) x) → ((double (double f)) x)
```

Then `(double (double double))`

will return a procedure that applies `(double double)`

twice:

```
(((double (double double)) f) x) → (((double double) ((double double) f)) x)
→ (((double double) (double (double f))) x)
→ (((double (double (double (double f))))) x)
```

This is a procedure that apply `f`

$2\times2\times2\times2=16$ times.

Which means that `(double (double double)) inc)`

is a procedure that applies `inc`

16 times. Thus `(((double (double double)) inc) 5)`

should evaluate to 21.