重复高阶函数

时间:2020-04-13 17:01:39

标签: python

我正在写一个接受lambda表达式,一个数字,然后是必须重复该表达式的次数的高阶。这就是我所拥有的:

#Square Root
sqrt = lambda x: x ** (1/2)

#Repeat
def repeat(f,x,r):
    return [f(i) for r in x]

这是它应该做的:

>>> repeat(sqrt, 2, 0)
2
>>> repeat(sqrt, 2, 1)
1.4142135623730951
>>> repeat(sqrt, 2, 2)
1.189207115002721

这是错误消息:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "main.py", line 66, in repeat
    return [f(i) for r in x]
TypeError: 'int' object is not iterable

这不是重复,因为我在问如何修正我的代码,而不是如何解决问题。而且这不是家庭作业,它只是一个可以更好地理解高阶函数的项目。

4 个答案:

答案 0 :(得分:1)

如果使用for循环,类似的事情会起作用。

#Square Root
sqrt = lambda x: x ** (1/2)

#Repeat
def repeat(f,x,r):
    for i in range(r):
        x = f(x)
    return x

print(repeat(sqrt, 2, 2))

答案 1 :(得分:0)

列表理解不是这里的正确工具。您只需要一个值-列表理解总是创建一个列表。

由于这似乎是一种练习,因此与lambda的样式和高阶函数保持一致,因此您可以使用类似以下内容的方法进行递归:

sqrt = lambda x: x ** (1/2)

rep = lambda f, x, r: f(x) if r < 1 else f(rep(f, x, r - 1))

rep(sqrt, 2, 0)
# 1.4142135623730951
rep(sqrt, 2, 1)
# 1.189207115002721

如果r较大,则递归深度可能会出现问题。

您也可以使用functools.reduce

from functools import reduce

sqrt = lambda x: x ** (1/2)

rep = lambda f, x, r: reduce(lambda n, _: f(n), range(r+1), x)

rep(sqrt, 2, 0)
# 1.4142135623730951

rep(sqrt, 2, 1)
# 1.189207115002721

答案 2 :(得分:0)

#Square Root
sqrt = lambda x: x ** (1/2)

#Repeat
def repeat(f,x,r):

    if r > 0:
        return repeat(f,f(x),r-1)
    else: 
        return x

print(repeat(sqrt, 2, 2))
>> 1.189207115002721

使用递归的解决方案

答案 3 :(得分:-1)

def repeat(f,x,r): 
    return [f(i) for r in range(x)]

您正在尝试迭代不可能的数字

相关问题