0

物事の蓄積を見つける一見単純な関数の作成に取り組んでいます。これは非常に抽象的で、署名は次のとおりです。

def accumulate(combiner, start, n, term):
    """Return the result of combining the first n terms in a sequence."""
    "*** YOUR CODE HERE ***"

この質問の詳細:

「Accumulate は、合計と積と同じ引数 term と n を引数として取り、現在の項を前の項の累積とどのように結合するかを指定する (2 つの引数の) コンバイナ関数と、何を指定するかを指定する開始値を指定します。累積を開始するために使用する基準値。」-- カリフォルニア大学バークレー校 CS61A 2013 年秋、John DeNero より

「コンバイナ」とは、「開始」から「n」までの用語が累積される方法を指します (add、sub、mul など)。コンバイナーは最大 2 つの引数を取ります。

「項」とは、「開始」で始まり「n」で終わる各項に適用される機能を指します。これは、各項の 2 乗、sqrt、n%//2 を取ることを意味する場合があります。

functools.reduce を使用せずにこの問題に取り組みたいと考えています。

関数合成のループを作らなければならないことはわかっていますが、ここが私を混乱させる部分です。そして、各関数に 2 つの引数 (古い累積と現在の項) を取らせる必要があります。

私はこれに2日間取り組んできましたが、自分自身をたくさん混乱させたので、私のコードはめちゃくちゃです. 助言がありますか?

def accumulate(combiner, start, n, term):
    """Return the result of combining the first n terms in a sequence."""
    now=0
    while start+now+1<=n:
        def combiner(x,y):
                old=combiner(start+now,start+now+1)
                old=combiner(old,start)
                now+=1
    return old

「start+now+1」とは、少なくとも n の項を取得するまで、term(n) でコンバイナ関数の実行を開始できないという事実を指します。しかし、古い合計を保存して更新しながら、最後の2つの値を結合し続ける必要があるため、混乱します。

4

1 に答える 1