是否有一个库函数可以在以下意义上创建递归列表,
recursive_list(f, x0, n) = [x0, f(x0), f(f(x0)), f(f(f(x0))), ...]
返回列表中有
n
个元素?
如果不是的话,这怎么写?
itertools.accumulate
,它的工作原理类似于reduce,但会为您提供每个中间值
def repeated_application(f_unary, x0, n):
def f_binary(acc, _):
return f_unary(acc)
return itertools.accumulate(range(n), f_binary, initial=x0)
您只需将一元函数转换为二元函数即可。
注意,这会返回一个迭代器(这样更通用)。
此外,
n
的工作方式尚未明确,您可以调整它以满足您的要求
我还想指出,使用基本语言结构的直接方式是完全可以接受的;
def recursive_application(f, x0, n):
acc = x0
result = [acc]
for _ in range(n):
acc = f(acc)
result.append(acc)
return result
或者作为发电机,它非常干净:
def repeated_application(f, x0, n):
acc = x0
yield acc
for _ in range(n):
acc = f(acc)
yield acc
标准库中没有这样的函数,但编写一个不需要太多代码:
def recursive_list(f, x, n):
return [x] + [x := f(x) for i in range(n-1)]
按照建议这里使用
repeat
和reduce
:
from itertools import repeat
from functools import reduce
def repeated(func, n):
def apply(x, f):
return f(x)
def ret(x):
return reduce(apply, repeat(func, n), x)
return ret
recursive_list = [repeated(f, i) for i in range(5)]
递归列表中的元素是函数。
例如:
def f(x):
return x*x
recursive_list[3](2)
# 256