Из-за максимальной глубины рекурсии вы не сможете вычислить факториалы больше 1000 (на самом деле меньше, потому что некоторые уровни стека уже используются другими вызывающими функциями)
Поэтому вам необходимо реализовать итеративный подход . Чтобы получить числа, выраженные в виде цифр в списке, будет проще хранить цифры в обратном порядке, чтобы индекс di git соответствовал степени 10, на которую оно умножается. Вы можете перевернуть список для удобства чтения при печати или при возврате результата.
С этой стратегией хранения di git умножение logi c может быть более простым. Вы также должны реализовать это без «обмана» с помощью целых чисел бесконечного размера Python (например, 10**((len(listx)-n-1)+(len(listy)-m-1)
):
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]
output:
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, ...