reduce
入力が間違っているので、の階乗を計算しないでくださいp
。実際、使用する方が簡単ですsum
:
return [x for x in range(1, 1000)
if x == sum(math.factorial(int(q)) for q in str(x))]
このfunctools.reduce
関数は次のように考えることができます。
reduce(f, [a, b, c, d, ...]) == f(f(f(a, b), c), d) ...
したがって、たとえば、x == 145の場合、reduce
パーツは次のように計算します。
int(reduce(lambda p, q: factorial(int(p)) + factorial(int(q)), str(x)))
== int(reduce(lambda p, q: factorial(int(p)) + factorial(int(q)), "145"))
== int(factorial(factorial(1) + factorial(4)) + factorial(5))
== int(factorial(1 + 24) + 120)
== int(15511210043330985984000000 + 120)
== 15511210043330985984000120
非常に大きな数の階乗を計算する必要があるため、インタプリタが終了しない可能性があります((2×9!)を検討してください!...)
それでも保持する必要がある場合はreduce
、次のように変更する必要があります。
reduce(lambda p,q: p + math.factorial(int(q)), str(x), 0)
# ^ ^
# No need to factorial Add initializer too