-1

重複の可能性:
funcの呼び出し。入力を変更します

入力で数値のリストを受け取り、出力で数値のリストを返す再帰関数を作成する必要があります。たとえば、次のように呼び出されます。

rec_cumsum([2,2,2,3])

出力は次のようになります。

[2,4,6,9]

物事は、これが機能するように頭を動かすことができないようです..これは私に私の再帰的思考全体に疑問を投げかけました..私がこれまでに持っているものは:

newlist = []
k = 1
def rec_cumsum(numbers):
    if len(numbers) == 0:
        return 0
    if len(numbers) > 1 and len(numbers) != (k+1):
        newlist[k+1] == newlist[k+1] + newlist[k]
        k = k+1
        return rec_cumsum(numbers)

しかし、私にはまったく意味のないエラーが発生しています。再帰は常に番号を取得し、リストの次の場所に保存するよりも、前の番号に追加する必要があります。(新しい番号または元の番号)

4

1 に答える 1

3

私はそれをこのように書くでしょう:

def cumulative_sum(lst,prev=0):
    if not lst:
        return []
    else:
        elem = prev+lst[0]
        return [elem] + cumulative_sum(lst[1:],prev=elem)

print cumulative_sum([2,2,2,3])

ここでコードを見てみましょう(正しい結果が得られるかどうかを判断するために実際にロジックを調べたわけではないことに注意してください。以下は、コードがスローする可能性のある例外にのみ対処します)。

次の行が原因で、おそらくIndexErrorが発生しています。

newlist[k+1] == newlist[k+1] + newlist[k]

まだ存在していないリスト位置に割り当てています。リストを事前に割り当てることができます。

newlist = [0]*len(lst)

ただし、これを修正しても、次の行が原因で、コードで再帰エラーが発生します。

k = k + 1

ここでの問題は、左側kがローカルであるのに対し、右側kはグローバルであるということです。したがって、基本的にこれを実行するたびに、ローカルのものを取得しk == 2、グローバルなものには触れません。本当にグローバルを変更したい場合は、を介してグローバルとしてk宣言する必要があります。もちろん、この関数を使用するたびにリセットする必要がありますが、これはやや奇妙なAPIになります。 kglobal kk

于 2012-11-16T19:14:12.257 に答える