创建一个列表,累积对输入值重复调用函数的结果

问题描述 投票:0回答:3

是否有一个库函数可以在以下意义上创建递归列表,

recursive_list(f, x0, n) = [x0, f(x0), f(f(x0)), f(f(f(x0))), ...]

返回列表中有

n
个元素?

如果不是的话,这怎么写?

python list recursion higher-order-functions
3个回答
3
投票

您可以使用

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

2
投票

标准库中没有这样的函数,但编写一个不需要太多代码:

def recursive_list(f, x, n):
    return [x] + [x := f(x) for i in range(n-1)]

-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
© www.soinside.com 2019 - 2024. All rights reserved.