#python #function #optimization #factorial
#python #функция #оптимизация #факториал
Вопрос:
Итак, я добился этой функции с помощью параметра распаковки (* x), но я хочу, чтобы он отображал результат, а не возвращал его, и я хочу хорошую оптимизацию, то есть мне все еще нужно, чтобы это была функция из двух строк
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
я пытался добиться этого, реализовав лямбда, но я не знал, как передать параметр *x
Комментарии:
1. Если текущий ответ решает ваш вопрос, то примите его, поставив галочку под стрелками голосования, вы можете изменять принятый ответ столько раз, сколько пожелаете, если появится лучший.
Ответ №1:
Ваша факториальная лямбда верна. Я полагаю, что вы хотели бы вычислить факториалы для списка, скажем, [1, 2, 3] и вывести результаты, вот как вы можете этого добиться.
fact = lambda x: x*fact(x-1) if x > 0 else 1
print(*[fact(i) for i in [1, 2, 3]])
Который будет выводить: 1, 2, 6
Другой вариант, если у вас есть python 3.8, — использовать понимание списка с помощью нового оператора walrus (:=) , это немного сложнее, но вычислит и выведет все факториалы до n включительно, при этом все еще вписываясь в требуемые вами две строки.
fac, n = 1, 5
print(*[fac for i in range(1, n 1) if (fac := fac*i)])
Который будет выводить: 1, 2, 6, 24, 120
Комментарии:
1. спасибо, но как насчет первого решения (с def(* x) нет ли способа ввести print во вторую строку без его вызова при каждом вызове функции recursif !
2. Я не верю, что есть способ сделать это всего за две строки, используя def. Поскольку функция является рекурсивной, любой оператор print внутри функции будет выполняться при повторном вызове функции. Вам нужно будет вернуть результат из функции и распечатать его. Почему вы должны написать эту программу всего в две строки?
3. Я отредактировал свой первоначальный ответ, чтобы включить решение, которое работает на python 3.8 , как еще один способ решить эту проблему в 2 строках.
Ответ №2:
Оптимизированное факториальное число отображается функцией, которую я создал ниже.
def fact(n):
list_fact = []
if n > 1 and n not in list_fact:
list_fact.extend(list(range(1, n 1)))
return reduce(lambda x, y: x * y, list_fact)
print(fact(9000)) # it will display output within microseconds.
Примечание:
во время итерации я сохранил все предыдущие значения в список, чтобы вычисление каждого значения не происходило каждый раз.