****If this doesn't aid your understanding, then ignore it**** Suppose we have a recursive function myrecfn: def myrecfn(args): where contains occurences of the function's name, "myrecfn". Assume that myrecfn is the only non-built-in function that gets called in . We can simulate myrecfn using an infinite family of non-recursive functions. [actually, since computers have a finite amount of memory, a very large finite family will work, equal to sys.getrecursionlimit(), which by default is 1000] def g0(args): with every occurence of "myrecfn" replaced by "g1" def g1(args): with every occurences of "myrecfn" replaced by "g2" def g2(args): with every occurences of "myrecfn" replaced by "g3" def g3(args): with every occurences of "myrecfn" replaced by "g4" ...and so on. Note that calling g0(args) will have the same effect as calling g7(args).