Прежде всего, рекурсивные лямбда-выражения совершенно не нужны. Как вы сами указываете, чтобы лямбда-выражение вызывало само себя, оно должно иметь имя. Но лямбда-выражения - это не что иное, как анонимные функции. Поэтому, если вы дадите лямбда-выражению имя, это уже не лямбда-выражение, а функция.
Следовательно, использование лямбда-выражения бесполезно и только смущает людей. Поэтому создайте его с помощью def.
Но да, как вы сами обнаружили, лямбда-выражения могут быть рекурсивными. Ваш собственный пример. На самом деле это настолько фантастически рекурсивно, что вы превышаете максимальную глубину рекурсии. Так что это нормально рекурсивно. Ваша проблема в том, что вы всегда вызываете add в выражении, поэтому рекурсия никогда не останавливается. Не делай этого. Ваше выражение может быть выражено так вместо этого:
add = lambda a, b: a > 0 and (1 + add(a-1, b)) or b
Который решает эту проблему. Тем не менее, ваше первое определение - правильный способ сделать это.