0

它是 Euler 项目 #4 的答案。

回文数的两种读法都是一样的。由两个 2 位数字的乘积构成的最大回文数是9009 = 91 99

找出由两个 3 位数字的乘积构成的最大回文数。

回答:

906609

代码是:

from multiprocessing import Pool
from itertools import product

def sym(lst):
    rst=[]
    for x,y in lst:
        tmp=x*y
        if rec(tmp):
            rst.append(tmp)
    return rst

def rec(num):
    num=str(num)
    if num == "".join(reversed(num)):    return True
    else:    return False

if __name__ == "__main__":
    pool=Pool(processes=8)
    lst=product(xrange(100,1000),repeat=2)
    rst=pool.map(sym,lst)
    #rst=sym(lst)
    print max(rst)

当我运行这个:

#    TypeError:'int' object is not iterable

但我无法理解...不是列表可迭代的吗?还是我的代码有错误?

4

1 回答 1

4

您的问题在于功能sym

sym正在传递您的产品可迭代的第一个元素。(例如lst = (100,100))。当您进入for循环时,您正在迭代lst然后尝试将其解压缩为两个数字 - 相当于:

for x,y in (100,100):
    ...

由于明显的原因而失败。

我认为您可能希望完全摆脱 for 循环——这可能是您的串行版本的产物。

def sym(lst):
    x,y=lst
    tmp=x*y
    if rec(tmp):
        return tmp
    else:
        return None  #max will ignore None values since None > x is always False.

回溯有点神秘——显然回溯被返回到Pool然后被重新提出......但是它的完成方式使它有点难以追踪。

有时,在调试这些东西时,Pool.map()用普通版本的map. 然后,在您的主“线程”上引发任何引发的异常,并且追溯可以更容易遵循。

于 2012-06-21T03:23:39.130 回答