1

次の再帰関数があります

def collatz(n,seq=[]):
    seq.append(n)
    if n == 1:
        return seq
    if n%2 == 0:
        return collatz(n/2, seq)
    else:
        return collatz((3*n)+1, seq)

この関数を複数回実行すると、seq には以前の実行の値が含まれています。

>>> collatz(1)
[1]                # correct
>>> collatz(2)
[1, 2, 1]          # should be [2,1]
>>> collatz(3)
[1, 2, 1, 3, 10, 5, 16, 8, 4, 2, 1]  # should be [3, 10, 5, 16, 8, 4, 2, 1]

seqこれを防ぐ方法は、を呼び出すときに に空のリストを与えることcollatzです:

>>> collatz(3,seq=[])
[3, 10, 5, 16, 8, 4, 2, 1]

の代わりcollatzにできるように別の方法で書く方法はありますか?collatz(3)collatz(3,seq=[]

4

1 に答える 1

5

seq=Noneデフォルト値として使用し、関数内に if 条件を追加します。

def collatz(n, seq=None):
    seq = [] if seq is None else seq
    seq.append(n)
    if n == 1:
        return seq
    if n%2 == 0:
        return collatz(n/2, seq)
    else:
        return collatz((3*n)+1, seq)

関連: Python での「最小の驚き」: 変更可能な既定の引数

于 2013-11-14T13:21:27.690 に答える