递归函数 - Collat​​z

时间:2016-03-22 10:45:49

标签: 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]]]]]]]

如何像这样输出(使用递归函数):

>>>Collatz: 21 64 32 16 8 4 2 1

2 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:3)

正如tobias已经回答的那样,你需要扩展不附加以获得一个平面列表,但你也可以使用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

您可能还应确保输入为非负数,或者您将结束 RuntimeError