我已经做了:
def collatz(b):
l=[b]
if b==1:
return 1
elif b%2==0:
l.append(collatz(b/2))
else:
l.append(collatz(b*3+1))
return l
但是,这样的输出:
>>>[21, [64, [32, [16, [8, [4, [2, 1]]]]]]]
如何使输出如此(使用递归函数):
>>>Collatz: 21 64 32 16 8 4 2 1
最佳答案
使用extend
而不是append
,并确保始终返回列表,以返回“平面”列表:
def collatz(b):
l=[b]
if b==1:
return [1] # wrapped in list
elif b%2==0:
l.extend(collatz(b/2)) # extend
else:
l.extend(collatz(b*3+1)) # extend
return l
或者更简洁一点:
def collatz(b):
if b == 1:
return [b]
elif b%2==0:
return [b] + collatz(b/2)
else:
return [b] + collatz(b*3+1)
如果要返回
Collatz:
前缀,必须使用包装函数:def collatz(x):
def collatz_inner(b):
if b == 1:
return [b]
elif b%2==0:
return [b] + collatz_inner(b/2)
else:
return [b] + collatz_inner(b*3+1)
return "Collatz: " + ' '.join(map(str, collatz_inner(x)))