5

私は非公式にバークレーでPythonコースCS61Aを行っていますが、提供されたテンプレートの最後に1つの式のみを提供する必要がある1つの単純な割り当てに完全に困惑しています。問題のコードは次のとおりです。

# 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

私はこれを機能させるためにあらゆることを試みました。このreturnstmtはそれを行う必要があるように私には思えます:

return reduce(compose1, range(n))

しかし、私は近くにさえいません。Compose1は2つの引数(f、g)を取り、これらは両方とも関数である必要があります。ただし、returnステートメントが「compose1」を呼び出す場合、「compose1」は「f」に「0」を使用し、「g」に「n」を使用します。ただし、「f」と「g」は「square」と呼ばれる関数である必要があります。

私は何が欠けていますか。

4

3 に答える 3

5

ここにヒントがあります。の戻り値がどうcompose1(square, square)なるかを考えてください。

于 2013-02-23T20:46:57.893 に答える
1

reduceアイテムが1つしかないリストが指定された場合、エッジケースがあります。最初のアイテムを返すだけです。したがって、入力[f]するreturn reduce(compose1, [f])と、に等しくなりfます。

2つのアイテムが提供された場合compose1、実際にはそれらの2つのアイテムに適用されて返されます。だから[f, f]戻るだろう:

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

リスト内の次の項目は、前の結果を最初の引数として一緒に2番目の引数として使用されます。したがって、供給すると、次のように[f, f, f]なります。

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

これで、パターンが表示されます。fリスト内のすべてが1回適用されます。したがって、時間[f] * nのリストを取得する必要があります。nf

于 2013-02-23T21:03:55.760 に答える
0

作成には2つの引数が必要で、どちらも関数である必要があります

を使用することにより、整数のペアをrange渡すことになります( sは呼び出せないため、当然爆発します。作成する関数のリストを渡します。compse1int

reduce最初の引数を2番目の引数の最初の2つの要素で呼び出し、次にその結果と3番目の要素で呼び出します...最後に到達するまで。中間結果は次のようになります。

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 に答える