我有以下递归功能
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=[]
?
答案 0 :(得分: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)
相关:“Least Astonishment” in Python: The Mutable Default Argument