首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >递归函数-Collatz

递归函数-Collatz
EN

Stack Overflow用户
提问于 2016-03-22 18:45:49
回答 2查看 1.7K关注 0票数 2

我做了以下几点:

代码语言:javascript
复制
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

但是,输出如下:

代码语言:javascript
复制
>>>[21, [64, [32, [16, [8, [4, [2, 1]]]]]]]

如何生成这样的输出(使用递归函数):

代码语言:javascript
复制
>>>Collatz: 21 64 32 16 8 4 2 1
EN

回答 2

Stack Overflow用户

发布于 2016-03-22 18:47:23

使用extend代替append,并确保总是返回一个列表,以返回一个“平面”列表:

代码语言:javascript
复制
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

或者更简洁一点:

代码语言:javascript
复制
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:前缀,则必须使用包装函数:

代码语言:javascript
复制
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)))
票数 3
EN

Stack Overflow用户

发布于 2016-03-22 19:04:56

正如tobias已经回答的那样,您需要扩展not append来获取平面列表,但您也可以使用if/else返回[b] + collatz...来获取返回的值的平面列表:

代码语言:javascript
复制
def collatz(b):
    if b == 1:
        return [b]
    return [b] + collatz(b / 2) if not b % 2 else [b] + collatz(b * 3 + 1)

您可以使用打印以任意方式格式化输出:

代码语言:javascript
复制
In [5]: from __future__ import print_function

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

您可能还应该确保输入是非负的,否则将导致RuntimeError。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36152287

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档