python-3.x - 是否可以将这两个函数合并为一个调用另一个函数
问题描述
想知道是否可以将这两个函数合并在一起,它似乎可以通过递归成为一个奇异函数,但我不确定。我并没有真正做很多编程,但这按预期工作,我只是认为将它作为一个单独的功能会很好。只是不确定如何对递归进行编程,任何建议都会非常感谢
def sieve(A, n):
for i in A:
if i % n == 0 and i > n:
A.remove(i)
return A
def primelist(N):
A = [i for i in range(2, N + 1)]
for i in A:
A = (sieve(A, i))
print(A)
决定采用新方法并解决:
def primelist(N):
k = 0
A = [i for i in range(2, N + 1)]
while k < len(A):
for i in A:
if i % A[k] == 0 and i > A[k]:
A.remove(i)
k += 1
return(A)
解决方案
决定采用新方法并解决:
我们可以做得更好——您的解决方案和@ikuamike 的解决方案有同样的问题。这些行尤其是低效的:
for i in A:
if i % A[k] == 0 and i > A[k]:
首先,如果可能,我们应该在更难的测试之前做一个更简单的测试,所以if
实际上应该是:
for i in A:
if i > A[k] and i % A[k] == 0:
在模数(除法)测试之前做比较(减法)测试。(当你不需要的时候,为什么要进行所有这些划分?)
下一个问题是不需要测试从A[0]
到的所有数字,因为它们被比较消除了,所以为什么不首先将它们排除在外:A[k]
for i in A[k + 1:]:
if i % A[k] == 0:
修改后的代码:
def primelist(N):
k = 0
A = [i for i in range(2, N + 1)]
while k < len(A):
for i in A[k + 1:]:
if i % A[k] == 0:
A.remove(i)
k += 1
return A
将 N 设置为 10,000,您可以衡量时间改进。
推荐阅读
- powershell - 在 Powershell 中转义与号 (&) 和加号 (+)
- entity-framework - 如何改进这个 Entity Framework Core 查询?
- qt - 如何在 QOpenGLTexture 上渲染文本?
- java - LibGDX:如何从主游戏屏幕重复显示/隐藏覆盖弹出菜单
- node.js - NodeJs - 安全的 Web Socket 和客户端连接
- git - Gitlab-runner 删除远程文件,尽管 .gitignore
- pandas - 根据 Pandas 数据框中的相应值创建新列
- laravel - How to get data from database based on Many to many relation in Laravel Eloquent ORM
- c++ - 在 Windows 10 中构建 OpenCV 时出现 Qt 和 cvv 的链接错误
- ios - Label.text 为零