I am currently trying to interpret the code but i cant seem to visualise it even when i use python tutor.
def two(f): return lambda x: f(f(x)) def three(f): return lambda x: f(f(f(x))) print(three(two(lambda x: x+5))(2)) print(three(two)(lambda x: x+5)(2))
For the first print output, I interpreted it this way:
two(two(two(x+5))) = (x + 5 + 5) + (5 + 5) + (5 + 5) = 32
Did I interpret it correctly?
Also, I don’t really know how to interpret the second print output.
Advertisement
Answer
two(f)
returns a function that applies f
twice, and three(f)
returns a function that applies f
three times.
If f
is a function that adds 5, then three(two(f))
is a function that adds 5 six times (3 * 2 = 6). three(two(f))(2) == 32
, so you got the right answer, but I think you got it the wrong way.
three(two)
, however, is a function that applies two
three times, so three(two)(f) == two(two(two(f)))
. two(f)
adds 5 two times. two(two(f))
adds 5 four times. two(two(two(f))))
adds 5 eight times, so three(two)(f)(2)
is 2 + 5 * 8 = 42.
Functions like these are actually a very important part of the development of computing. They are known as Church numerals, and this question demonstrates how to do multiplication and exponentiation with them.