Python 递归函数Collatz

Python 递归函数Collatz,python,recursion,Python,Recursion,我已提出: 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]]]]]]] 如何使输出像这样(使用递归函数):

我已提出:

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]]]]]]]
如何使输出像这样(使用递归函数):


使用
extend
而不是
append
,并确保始终返回列表,以返回“平面”列表:

或者更简洁一点:

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:
前缀,必须使用包装函数:

>>>Collatz: 21 64 32 16 8 4 2 1
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)))

正如tobias已经回答的,您需要扩展not append以获得一个简单列表,但您也可以使用if/else返回
[b]+collatz…
来获得返回值的简单列表:

def collatz(b):
    if b == 1:
        return [b]
    return [b] + collatz(b / 2) if not b % 2 else [b] + collatz(b * 3 + 1)
您可以使用打印按需格式化输出:

In [5]: from __future__ import print_function

In [6]: print("Collatz :",*collatz(20))
Collatz : 20 10 5 16 8 4 2 1

您可能还应该确保输入是非负的,否则将导致运行时错误。

或更短:
[b]+collatz(b/2如果不是b%2,则为b*3+1)
。顺便说一句,使用
打印
*
:-)的技巧很好
In [5]: from __future__ import print_function

In [6]: print("Collatz :",*collatz(20))
Collatz : 20 10 5 16 8 4 2 1