L5 Hw2 1
increment = lambda x: x + 1
def make_repeater(f, n):
"""Returns the function that computes the nth application of f.
>>> add_three = make_repeater(increment, 3)
>>> add_three(5)
8
>>> make_repeater(triple, 5)(1) # 3 * (3 * (3 * (3 * (3 * 1))))
243
>>> make_repeater(square, 2)(5) # square(square(5))
625
>>> make_repeater(square, 3)(5) # square(square(square(5)))
390625
"""
# 其中注释的部分会产生无限递归的问题。
# 这个的主要原因是最终lamda表达式中的f 绑定的也是最终的f,
# 因此它并不像洋葱而像没有base的递归函数。
# 而下方修改的方法将每层的状态f都保存了因此像洋葱一样可以展开。
# 可以用tutor可视化看两种方法的区别。
# 但是我的建议是用def语句来实现本功能如f1函数更加清晰,
# 最好不要在循环语句中使用lambda定义函数。
original = f
# for i in range(1,n):
# f = lambda x: original(f(x))
# return f
for i in range(1, n):
f = lambda x, f=f: original(f(x))
return f
def f1(x):
for i in range(n):
x = f(x)
return x
return f1
add_three = make_repeater(increment, 3)
print(add_three(5))