首页 > 解决方案 > 为什么 len 不返回正确的值?

问题描述

def dbl_linear(n):
    u=[1]
    i=0
    for a in u:
        u.append((2*a+1))
        u.append((3*a+1))
        u=set(u)
        u=list(u)          
        if len(u)>=n:
            print(len(u))  
            break
    return len(u)

我希望这段代码返回列表 u 中的 n 个元素。但这并没有发生。有人可以帮忙吗?我输入 n=20。len(u) 以 15 或 7 的形式出现。每次运行都有不同的答案

标签: pythonpython-3.x

解决方案


修改您正在迭代的对象基本上是未定义的行为,您不能假设迭代是否会考虑新项目,特别是在调整大小时(list是 O(1)摊销附加,因为它是 O (1)在保留空间上,但他们经常需要重新分配整个事物以为新元素腾出更多空间)。更不用说这里您只是在第一次迭代期间修改初始列表,之后您将更新另一个不相关的列表。

甚至没有理由使用for a in u,只需使用无限循环(并且可能记住最后一个元素,因为您的唯一性 viaset会打乱列表,或者在插入之前检查元素是否已经存在,in是 O(n) 但 set( a) 和列表(a))。


推荐阅读