2013-02-23 14 views
5

私はPythonコースCS61AをBerkelyから非公式にやっています。私は、提供されたテンプレートの最後に1つの式を提供する必要がある簡単な割り当てによっては完全に困惑しています。ここに問題コードがあります:Pythonの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 

私はこの作業を行うためにすべてを試しました。この返信はそれを行うべきであると私には思われます:

return reduce(compose1, range(n)) 

しかし、私は近くでもありません。 Compose1は2つのargs(f、g)をとり、これらは両方とも関数でなければなりません。しかし、return文が 'compose1'を呼び出すとき、 'compose1'は 'f'に '0'を、 'g'に 'n'を使います。しかし 'f'と 'g'は 'square'という関数でなければなりません。

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

+0

ここに私のヒントがあります:「f」の「n番目の」アプリケーションを計算しようとしています。つまり、コードが抜けていれば(何らかの形で)「f」と「n」の両方が含まれている必要があります。あなたの提案されたreturn文は 'f'で何もしません。 'n'回' f'をどのように実行するのか考えてみてください。 –

答えて

1

reduceは、1つの項目のみのリストが提供されている場合には、最初の項目を返します。したがって、return reduce(compose1, [f])[f]と入力すると、fに等しくなります。

2つの項目が指定されている場合、実際にはこれらの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回適用されます。だからnfとリストを取得するには[f] * nが必要になります。

+0

Timありがとうございます。これは最終的に意味をなさない。ソリューションがシンプルでなければならないことがわかっていたので、私は本当に困惑し、不満でしたが、それは私の手の届かないものでした。あなたの説明は理にかなっています。再度、感謝します。 –

0

作曲はあなたがint sが呼び出し可能ではありませんので、当然吹くた(整数のcompse1ペアを渡している。あなたはのリストを渡したいrangeを使用することにより機能

する必要があり、どちらも2 argementsを取り

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)))) 
.... 
+0

私は決して 'reduce'を使っていないので、これで私の手を試してみました - ありがとう。あなたの説明の周りに私の頭を包み込むのに分かったが、私はそれを理解した。 –

5

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

関連する問題