Как делать функцию factorial в Пайтоне, не используя numpy или другой модуль? (видеть мой пример)

Я играю немного с функцией, чтобы вычислять factorial любого числа и мне случилось создавать это используя numpy:

import numpy as np

def factorial(x):
    n=[]
    if x==1:
        return 1
    if x>1:
        while x>1:
            x-=1
            n.append(x+1)
    return np.prod(np.array(n)) 

Функция прокручивает изображение в окне верно, но как я указал на то, что я был должен прибегать в numpy, чтобы это делать. Мой вопрос - какой делать это используя базовый код, так как, как они знают, factorial любого числа продолжает формулу:

n!= n x (n-1) x (n-2) x ... x 1

Ввиду примера, который я поместил, мне хотелось бы знать, существует ли он, в базовом немного эквивалентном коде в:

np.prod(np.array(n)) 

Заранее большое спасибо.

0
задан 03.11.2017, 06:27
3 ответа

Такой легкий как

def factorial(numero):
    resultado=1
    for i in range(1, numero+1):
        resultado=resultado*i
    return resultado
0
ответ дан 24.11.2019, 04:31

Есть два способа это делать, уже будьте используя loop

def facto_2(n):
    for i in range(2,n):
        n*=i
    return n

или используя возврат (который я рекомендую тебе использовать ее, если и только, если нет другого способа решать проблему, так как он мало работоспособный)

def facto_1(n):
    return 1 if n==0 else n*facto_1(n-1)
0
ответ дан 24.11.2019, 04:31

Пайтон считает funci¦n высшими последовательностей (sum), но у него нет multiplicaci¦n . Манера умножать последовательность - используя functools.reduce:

from functools import reduce

def factorial(n: int) -> int:
    return reduce(int.__mul__, range(1, n+1))

В твоем первоначальном c¦digo, ты создаешь список, который ты превращаешь потом в np.array. Это расточительность памяти, так как únicamente ты нуждаешься в том, чтобы пробежать последовательность однажды. Он mÃ: s приведенный в соответствие использовать iterador , чего заканчивает тем, что является range().

1
ответ дан 24.11.2019, 04:31