Problem
Define a function cycle
that takes in three functions f1
, f2
, f3
, as arguments. cycle
will return another function that should take in an integer argument n and return another function. That final function should take in an argument x
and cycle through applying f1
, f2
, and f3
to x
, depending on what n was. Here‘s what the final function should do to x
for a few values of n
:
-
n = 0
, returnx
-
n = 1
, applyf1
tox
, or returnf1(x)
-
n = 2
, applyf1
tox
and thenf2
to the result of that, or returnf2(f1(x))
-
n = 3
, applyf1
tox
,f2
to the result of applyingf1
, and thenf3
to the result of applyingf2
, orf3(f2(f1(x)))
-
n = 4
, start thecycle
again applyingf1
, thenf2
, thenf3
, thenf1
again, orf1(f3(f2(f1(x))))
- And so forth.
Solution
"""
Returns a function that is itself a higher-order function.
>>> def add1(x):
... return x + 1
>>> def times2(x):
... return x * 2
>>> def add3(x):
... return x + 3
>>> my_cycle = cycle(add1, times2, add3)
>>> identity = my_cycle(0)
>>> identity(5)
5
>>> add_one_then_double = my_cycle(2)
>>> add_one_then_double(1)
4
>>> do_all_functions = my_cycle(3)
>>> do_all_functions(2)
9
>>> do_more_than_a_cycle = my_cycle(4)
>>> do_more_than_a_cycle(2)
10
>>> do_two_cycles = my_cycle(6)
>>> do_two_cycles(1)
19
"""
Iterative
def cycle(f1, f2, f3):
def set_iteration(n):
def set_initial(x):
for i in range(1, n + 1):
if i % 3 == 1:
x = f1(x)
elif i % 3 == 2:
x = f2(x)
else:
x = f3(x)
return x
return set_initial
return set_iteration
Recursive
def cycle(f1, f2, f3):
def wrapped(n):
def set_initial(x):
if n == 0:
return x
else:
if n % 3 == 1:
return f1(wrapped(n - 1)(x))
elif n % 3 == 2:
return f2(wrapped(n - 1)(x))
else:
return f3(wrapped(n - 1)(x))
return set_initial
return wrapped