<p>由于最大递归深度,您将无法计算大于1000的阶乘(实际上更小,因为某些堆栈级别已被其他调用函数使用)</p>
<p>因此,您需要实现一种迭代方法。为了在列表中生成以数字表示的数字,将更容易以相反顺序存储数字,以便数字的索引对应于它乘以的10的幂。您可以在打印或返回结果时反转列表,以提高可读性</p>
<p>使用这种数字存储策略,乘法逻辑可以更加简单。您还应该使用Python的无限大整数(例如<code>10**((len(listx)-n-1)+(len(listy)-m-1)</code>)实现它而不进行“欺骗”:</p>
<pre><code>def toDigits(n):
result = []
while n:
n,d = divmod(n,10)
result.append(d)
return result or [0]
def multDigits(A,B):
result = [0]
for i,a in enumerate(A):
for j,b in enumerate(B):
p10,carry = i+j,a*b
while carry:
if p10 >= len(result): result.append(0); continue
carry,result[p10] = divmod(carry+result[p10],10)
p10 += 1
return result
def factorial(N):
result = [1]
for n in range(2,N+1):
result = multDigits(result,toDigits(n))
return result[::-1]
</code></pre>
<p>输出:</p>
<pre><code>print(factorial(1000))
[4, 0, 2, 3, 8, 7, 2, 6, 0, 0, 7, 7, 0, 9, 3, 7, 7, 3, 5, ...
# proof that it works:
from math import factorial
digits = [ int(d) for d in str(factorial(1000)) ]
print(digits)
[4, 0, 2, 3, 8, 7, 2, 6, 0, 0, 7, 7, 0, 9, 3, 7, 7, 3, 5, ...
</code></pre>