我已经做了:

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)))

10-01 18:01