Otimizando uma função fatorial em python

Sep 26 2020

Então, eu alcancei essa função com o parâmetro de descompactação (* x) , mas quero fazer com que exiba o resultado e não retorne, e quero uma boa otimização, o que significa que ainda preciso que seja uma função de duas linhas

1.def fac(*x):
    2.return (fac(list(x)[0], list(x)[1] - 1)*list(x)[1]) if list(x)[1] > 0 else 1//here i need the one line to print the factorial

Tentei conseguir isso implementando lambda, mas não sabia como passar o parâmetro * x

Respostas

4 JackAshton Sep 27 2020 at 01:59

Seu lambda fatorial está correto. Suponho que você gostaria de calcular os fatoriais para uma lista, digamos [1, 2, 3] e gerar os resultados, é assim que você pode fazer isso.

fact = lambda x: x*fact(x-1) if x > 0 else 1
print(*[fact(i) for i in [1, 2, 3]])

O que resultará em: 1, 2, 6

Outra opção, se você tiver o python 3.8, é usar uma compreensão de lista com o novo operador walrus (: =), isso é um pouco mais complicado, mas irá calcular e gerar todos os fatoriais até n inclusive, enquanto ainda ajustando as duas linhas necessárias.

fac, n = 1, 5
print(*[fac for i in range(1, n+1) if (fac := fac*i)])

Que produzirá: 1, 2, 6, 24, 120