5

我正在通过 Berkely 非正式地学习 Python 课程 CS61A,我完全被一项简单的作业难住了,该作业要求我在提供的模板的最后只提供一个表达式。这是问题代码:

# HW 4 Q5. (fall 2012)

def square(x):
    return x*x

def compose1(f, g):
    """Return a function of x that computes f(g(x))."""
    return lambda x: f(g(x))

from functools import reduce

def repeated(f, n):
    """Return the function that computes the nth application of f, for n>=1.

    f -- a function that takes one argument
    n -- a positive integer

    >>> repeated(square, 2)(5)
    625
    >>> repeated(square, 4)(5)
    152587890625
    """
    assert type(n) == int and n > 0, "Bad n"
    return reduce(compose1, "*** YOUR CODE HERE ***" )

repeated(square, 2)(5) # Sample run

我已经尝试了一切来完成这项工作。在我看来,这个 return stmt 应该这样做:

return reduce(compose1, range(n))

但我什至没有接近。Compose1 需要两个参数 (f, g),它们都应该是函数。但是当 return 语句调用 'compose1' 时,'compose1' 使用 '0' 代表 'f' 和 'n' 代表 'g'。但是 'f' 和 'g' 应该是函数调用--'square'

我错过了什么。

4

3 回答 3

5

这里有一个提示。想想返回值是多少compose1(square, square)

于 2013-02-23T20:46:57.893 回答
1

reduce当提供只有一个项目的列表时有一个边缘情况:它只是返回第一个项目。所以如果你输入[f]return reduce(compose1, [f])等于f

如果提供了两个项目,compose1则实际应用于这两个项目并返回。所以[f, f]会返回:

  compose(f, f)
= lambda x: f(f(x))

列表中的下一项将用作第二个参数,前一个结果将用作第一个参数。因此,如果我们提供[f, f, f]它将返回:

  compose(compose(f, f), f)
= lambda x: f(f(f(x)))

现在你应该看到一个模式。列表中的每个f都应用一次。因此,您需要[f] * n获取带有ntimes的列表f

于 2013-02-23T21:03:55.760 回答
0

Compose 需要两个参数,这两个参数都需要是函数

通过使用range,您传递compse1了一对整数(由于ints 不可调用,因此正确地爆炸了。您想要传递要组合的函数的列表。

reduce在它的第二个参数的前两个元素上调用它的第一个参数,然后在那个结果和第三个元素上......直到你到达最后。中间结果将如下所示:

compose1(f1, f2)
compose1(compose(f1, f2), f3)
compase1(compose1(compose(f1, f2), f3), f4)
....

或更紧凑

 f1(f2(x))
 f1(f2(f3(x)))
 f1(f2(f3(f4(x))))
 ....
于 2013-02-23T20:46:41.780 回答