MMmh io personalmente trovo strana questa tua difficoltà: il caso base si individua subito e il passo induttivo altrettanto.

E' vero che in Erlang forse si vede un po' meglio
codice:
fac(0)- > 1;
fac(X) -> X * fac(X-1).
ma considerando che in Common Lisp ottieni
codice:
(defun fac(x)
           (if (= x 0)
               1
               (* x (fac (- x 1)))
(anche se devo ammettere che si vede bene anche qui, questione di parentesi)

vedrai che in Python non è poi così male
codice:
def fattoriale(n):
    if n == 0:                                    # caso base
        return 1
    return n * fattoriale(n - 1)             # passo induttivo