擅长:python、mysql、java
<p>您的<code>reduce</code>输入错误,不应计算<code>p</code>的阶乘。事实上,只使用<code>sum</code>:</p>
<pre><code>return [x for x in range(1, 1000)
if x == sum(math.factorial(int(q)) for q in str(x))]
</code></pre>
<hr/>
<p><a href="http://docs.python.org/3/library/functools.html#functools.reduce" rel="nofollow">^{<cd4>}</a>函数可以看作是:</p>
^{pr2}$
<p>例如,如果x==145,那么您的<code>reduce</code>部分将计算</p>
<pre><code> 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
</code></pre>
<p>解释器很可能无法完成,因为需要计算一个非常大的数的阶乘(考虑(2×9!)!…)在</p>
<p>如果仍需要保留<code>reduce</code>,则应将其更改为:</p>
<pre><code> reduce(lambda p,q: p + math.factorial(int(q)), str(x), 0)
# ^ ^
# No need to factorial Add initializer too
</code></pre>