首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > perl python >

如何把这个reduce写的代码改成for来写

2013-03-29 
怎么把这个reduce写的代码改成for来写这段代码是求素数的,reduce看起来吃力,要按照同样的算法来做谢谢各位

怎么把这个reduce写的代码改成for来写
这段代码是求素数的,reduce看起来吃力,要按照同样的算法来做
谢谢各位大神 


reduce(lambda i,n: i if 0 in [n%x for x in i] else i+[n] , xrange(2,100), [])

python 算法 lambda
[解决办法]
F = lambda i, n: i if 0 in [n % x for x in i] else i + [n]
R = []
for i in range(2, 100):
    R = F(R, i)
print R


def Fi(i, n):
    res = [n % x for x in i]
    if 0 in res:
        return i
    else:
        return i + [n]
R = []
for i in range(2, 100):
    R = Fi(R, i)
print R



[解决办法]
def F(l, n):
    for x in l:
        if n % x == 0:
            return
    l.append(n)

def P(l, n):
    from math import sqrt
    m = sqrt(n)
    for x in l:
        if (x <= m) and (n % x == 0):
            return
    l.append(n)

R = []
for i in range(2, 100):
    P(R, i)
print R

不知道F和P,谁更快?
[解决办法]
def P(l, n):
    from math import sqrt
    m = sqrt(n)
    for x in l:
        if x <= m:
            if n % x == 0:
                return
        else:
            break
    l.append(n)

R = []
for i in range(2, 1000000):
    P(R, i)
print R

[解决办法]
算法就基本是#4这样了
但程序还可以微调再优化
例如
在2之后n为偶数就没必要扔进def了
每位的数字和是3的倍数,该数也是3的倍数,例如27:2+7=9
在5后个位为5/0也是
还有其他一些排除规律
……
也可以完全用上述排除法得出质数列的,记得好像叫试除法?忘了

import也应该挪出函数外,虽然py只有第一次调用import,但后面每次def内都要检查一次的,降低效率
[解决办法]
其实没有必要import math的,
算sqrt用 “num**0.5” 就行,4楼的或者写成x*x<=n也行
------解决方案--------------------


昨晚google了一下,排除法应该叫“筛除法”,不是试除法
写了一个,但水平不高,测试比#4慢一百倍,瓶颈在生成器和sort(),但也没想到优化方法
但思路是这样的,每添加一个质数,就把其倍数在原数列中排除,剩下的数列最小的一个就是质数


    q = list(range(2, 10000))
    l = []

    while 1:
        if len(q) <= 2:
            l.extend(q)
            break
        else:
            qs = q.pop(0)
            l.append(qs)
            qm = q[len(q) - 1]
            q1 = set(qs * n for n in range(2, int(qm / qs) + 1))
            q = list(set(q) - q1)
            q.sort()

    print(l)

[解决办法]
from math import sqrt
from datetime import datetime, timedelta

def P(l, n):
    m = sqrt(n)
    for x in l:
        if x > m:
            break
        if n % x == 0:
            return
    l.append(n)

def Run(F, M):
    R = []
    tStart = datetime.now()
    for i in range(2, M):
        F(R, i)
    tEnd = datetime.now()
    tDelta = tEnd - tStart
    print tDelta
    L = len(R)
    print L, R[0 : L if L < 10 else 10]

M = 1000000
Run(P, M)

有没有更快一点的?
[解决办法]
你把tStart = datetime.now()放在 import 前和后比较一下
参考#7建议

引用:
Python code?12345678910111213141516171819202122232425from math import sqrtfrom datetime import datetime, timedelta def P(l, n):    m = sqrt(n)    for x in l:        if x > m:            b……

[解决办法]

n = 1000000
a = [True] * (n + 1)
b = []
for i in range(2, int(n ** 0.5) + 1):
    if a[i]:
        for j in range(i, int(n / i) + 1):


            a[j * i] = False
for i in range(2, n + 1):
    if a[i]:
        b.append(i)
print(b)


结合筛除法和开方
不会array,我水平到此为止了, 写不出更好的了
[解决办法]
楼上这个不错,简单优化一下...
a = [True] * (n + 1)
b = [2]
for i in range(3, int(n ** 0.5) + 1, 2):
    if a[i]:
        for j in range(i*i, n + 1, i):
            a[j] = False
for i in range(3, n + 1, 2):
    if a[i]:
        b.append(i)

热点排行