如何将函数应用于自身?

2024-06-26 17:46:26 发布

您现在位置:Python中文网/ 问答频道 /正文

假设我有一个函数,f,它接受某个变量并返回一个相同类型的变量。为了简单起见

def f(x):
    return x/2+1

我有兴趣一遍又一遍地将f应用到自身。像f(f(f(...(f(x))...)))。在

我可以这样做

^{pr2}$

但我想知道是否有一种更简单、更省事的方法来做同样的事情。我不想避免for循环(就像对我自己的一个挑战)。有没有什么方法可以使用map或类似的函数来完成这个任务?在


Tags: 方法函数类型mapforreturndef事情
3条回答

虽然从您的示例中看不清楚是否要计算最终的数值结果或累积一系列值,但可以使用非常简单的递归方法来处理lambda函数:

单一值:

f = lambda x, c = 1:x if c == 100 else f(x/2 + 1, c+1)
>>f(200)
2

值列表:

^{pr2}$

Is there maybe some way of using map or a similar function to accomplish this?

不是map,而是reduce。我不会用它来做这个,但是你可以在一个n-item序列上调用reduce,从而使f被调用n次。例如:

>>> def f(x):
...   return x+1
... 
>>> reduce(lambda n,_: f(n), range(100), 42)
142

说明:

  • n被分配给f的每个连续返回值。在
  • _range(100)中的数字列表。这些数字都被忽略了。重要的是有多少人。在
  • 42是起始值。在

100f(f(f...(f(42))...))的嵌套调用导致142。在

在Python中,for循环是最符合人体工程学和可读性最好的方法。所以我认为这主要是一个练习-在函数式语言中使用这些更自然。在

^{}通过反复调用包含两个参数的函数,将值列表折叠为单个值。这里是阶乘:

>>> import functools, operator
>>> operator.mul(2,3)
6
>>> functools.reduce(operator.mul, range(1, 10), 1)
362880

我们可以滥用这一点,只对其长度使用一个值列表,而忽略实际内容。在

^{pr2}$

或者我们可以将(一元)函数的副本串在一个列表中,并通过将每个副本应用于累积值来折叠它们。在

^{3}$

相关问题 更多 >