Есть два жестких частей об этой функции.
1. lambda a, b: b*a(a, b-1) if b > 0 else 1
.
2. "Ъ", что это folowing 1.
Для 1, это не более чем:
def f(a, b):
if b > 0:
b * a(a, b - 1)
else:
1
Для 2, это б
(lambda b: (lambda a, b: a(a, b))(lambda a, b: b*a(a, b-1) if b > 0 else 1,b))(num)
(this one)
на самом деле это б:
(lambda b: (lambda a, b: a(a, b))(lambda a, b: b*a(a, b-1) if b > 0 else 1,b))(num)
(this one)
Причина в том, что это не входит в определение второй и третьей лямбда, поэтому он относится к первому b.
После мы применяем Num и сдирать внешнюю функцию:
(lambda a, b: a(a, b)) (lambda a, b: b*a(a, b-1) if b > 0 else 1, num)
Это просто применение функции к кортежу, (лямбда-а, б: б * а (а, Ь-1), если б> 0 еще 1, Num)
Давайте назовем этот кортеж, как (е, NUM) (DEF F находится выше) Применив lambda a, b: a(a, b)
на него, мы получаем
F (F, NUM).
Предположим, что ваш Num 5.
По Definiton Р, сначала вычисляется в
5 * f(f, 4)
Тогда к:
5 * (4 * f(f, 3))
Все пути вниз к
5 * (4 * (3 * (2 * (1 * f(f, 0)))))
f (f, 0) соответствует 1.
5 * (4 * (3 * (2 * (1 * 1))))
Здесь мы идем, факториал 5.
я лучше один: 'лямбда-B: math.factorial (б)' – JBernardo
Dont изобрести квадратное колесо. – ShuklaSannidhya