UCB CS 61A - I Heard You Liked Functions...

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, return x
  • n = 1, apply f1 to x, or return f1(x)
  • n = 2, apply f1 to x and then f2 to the result of that, or return f2(f1(x))
  • n = 3, apply f1 to x, f2 to the result of applying f1, and then f3 to the result of applying f2, or f3(f2(f1(x)))
  • n = 4, start the cycle again applying f1, then f2, then f3, then f1 again, or f1(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

UCB CS 61A - I Heard You Liked Functions...

上一篇:阿里云数据管理DMS企业版发布年度重大更新 多项功能全面升级


下一篇:程序员真的是吃青春饭吗?如何面对传说中的 35 岁职业焦虑?