此Python函数根据Collatz猜想输出一个列表.这是一个未解决的数学问题,其中该函数将根据它是奇数还是偶数对‘n’执行不同的操作,每次函数重复时将‘n’输出到名为‘seq’的列表中.一旦数字‘16’出现在‘链’中,‘n’最终将衰减到终点(‘1’).

在这里,我试图使代码尽可能简洁.有什么办法可以缩短功能吗?

这是我的新手Python代码:

def collatz(n):

    seq = []
    n = int(n)

    if n == 0:
        return 
    
    elif n == 1:
        return seq + [n]
    
    elif n > 1 == True and n % 2 == 0:
        return seq + [n] + collatz(n/2)
    
    else:
        return seq + [n] + collatz(3*n+1)

print(collatz(7))

这将输出

[7, 22, 11, 34, 17, 52, 26, 13, 40, 20, 10, 5, 16, 8, 4, 2, 1]

推荐答案

到目前为止,您给出的函数对于负输入和0并不是完全健壮的:我会将其重写如下.不过,我认为您的文章非常易读,我不会提倡更简洁:可读性和简洁性几乎总是如此.

def collatz(n):

    seq = []
    n = int(n)

    if n <= 0:
        return False
    
    elif n == 1:
        return seq + [n]
    
    elif n % 2 == 0:
        return seq + [n] + collatz(n/2)
    
    else:
        return seq + [n] + collatz(3*n+1)

print(collatz(7))

如果你真的想要更简洁的代码,可以考虑@Kelly Bundy的这个解决方案:

def collatz(n):
    return [1] if n == 1 else [n] + collatz(3*n+1 if n%2 else n//2)

print(collatz(7))

或者,迭代而不是递归的解决方案

def collatz(n):
    seq = [n]
    while n != 1:
        n = 3*n+1 if n%2 else n//2
        seq.append(n)
    return seq

随心所欲地清理您的输入.

Python相关问答推荐

比较两个数据帧并并排附加结果(获取性能警告)

如何在箱形图中添加绘制线的传奇?

类型错误:输入类型不支持ufuncisnan-在执行Mann-Whitney U测试时[SOLVED]

如何让Flask 中的请求标签发挥作用

C#使用程序从Python中执行Exec文件

如何使用根据其他值相似的列从列表中获取的中间值填充空NaN数据

如何在Python中并行化以下搜索?

修复mypy错误-赋值中的类型不兼容(表达式具有类型xxx,变量具有类型yyy)

当递归函数的返回值未绑定到变量时,非局部变量不更新:

如何使用Pandas DataFrame按日期和项目汇总计数作为列标题

与命令行相比,相同的Python代码在Companyter Notebook中运行速度慢20倍

在Python中使用if else或使用regex将二进制数据如111转换为001""

如果包含特定值,则筛选Groupby

统计numpy. ndarray中的项目列表出现次数的最快方法

使用tqdm的进度条

如何强制向量中的特定元素在Gekko中处于优化解决方案中

Pandas:使列中的列表大小与另一列中的列表大小相同

将时间序列附加到数据帧

使用Django标签显示信息

GEKKO中若干参数的线性插值动态优化