9

私がやろうとしているのは、リストを再帰的に処理することです。私はPythonを初めて使用するので、すべてのコードを作成して実行するために送信したときに、奇妙な問題に直面しました.再帰関数を呼び出した後にリストが変更されました. これをテストするために、次のように書きました。

def recur(n):
    n.append(len(n))
    print '>',n
    if n[-1]<5: recur(n)
    print '<',n

そして関数を呼び出しました:

recur([])

結果は次のとおりです。

> [0]
> [0, 1]
> [0, 1, 2]
> [0, 1, 2, 3]
> [0, 1, 2, 3, 4]
> [0, 1, 2, 3, 4, 5]
< [0, 1, 2, 3, 4, 5]
< [0, 1, 2, 3, 4, 5]
< [0, 1, 2, 3, 4, 5]
< [0, 1, 2, 3, 4, 5]
< [0, 1, 2, 3, 4, 5]
< [0, 1, 2, 3, 4, 5]

私が期待していたのは

> [0]
> [0, 1]
> [0, 1, 2]
> [0, 1, 2, 3]
> [0, 1, 2, 3, 4]
> [0, 1, 2, 3, 4, 5]
< [0, 1, 2, 3, 4, 5]
< [0, 1, 2, 3, 4]
< [0, 1, 2, 3]
< [0, 1, 2]
< [0, 1]
< [0]

、単純な整数変数の場合と同様:

def recur(n):
    n=n+1
    print '>',n
    if n<5: recur(n)
    print '<',n

recur(0)
> 1
> 2
> 3
> 4
> 5
< 5
< 4
< 3
< 2
< 1

どうすれば状況を修正でき、何が間違っていると理解しましたか?

4

2 に答える 2

9

関数のすべての再帰呼び出しは、同じリストで動作します。コピーを作成する必要があります:

def recur(n):
    n.append(len(n))
    print '>',n
    if n[-1]<5: recur(n[:])  # <<<< Note the [:]
    print '<',n

How do I pass a variable by reference?への回答には、いくつかの良い説明があります。

于 2013-01-03T21:03:14.777 に答える
3

他の回答が示したように、リストを適切に変更しています。リストのコピーを作成したり、タプルのような不変のデータ構造を使用したりできます。

def recur(n=()):
    if len(n) > 4:
         return n
    return recur(n + (len(n),))
于 2013-01-03T21:08:07.013 に答える