如何缩短输出Collatz猜想序列的Python函数?
精简Collatz猜想序列生成函数
我写了一段基于Collatz猜想生成序列的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]
精简思路及优化后的代码
原代码存在冗余变量、无效条件判断等问题,可通过以下方式精简:
版本1:兼顾可读性与精简度
def collatz(n): n = int(n) if n <= 0: return [] return [n] + collatz(n//2 if n%2==0 else 3*n+1) if n != 1 else [1]
版本2:极致精简(一行lambda函数)
collatz = lambda n: [] if int(n)<=0 else [int(n)]+collatz(int(n)//2 if int(n)%2==0 else 3*int(n)+1) if int(n)!=1 else [1]
核心优化点:
- 移除冗余的
seq变量:直接用[n]拼接递归结果,无需空列表过渡 - 合并边界条件:将
n==0扩展为n<=0并统一返回空列表,避免返回None的不一致情况 - 替换浮点除法:用整数除法
//替代/,确保递归时始终传递整数类型 - 简化分支逻辑:用三元表达式合并奇偶判断和终止条件,减少代码行数
测试优化后的代码:
print(collatz(7)) # 输出:[7, 22, 11, 34, 17, 52, 26, 13, 40, 20, 10, 5, 16, 8, 4, 2, 1]
内容的提问来源于stack exchange,提问作者Alastair909
相关产品推荐
相关产品推荐

