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 中的“Least Astonishment”:可变默认参数

于 2013-11-14T13:21:27.690 回答