0

オイラープロジェクト#4の答えです。

回文数はどちらの方法でも同じように読めます。2 つの 2 桁の数の積から作られる最大の回文は です9009 = 91 99

2 つの 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繰り返し処理してから、次のlst2つの数値に解凍しようとします。

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 に答える