1. **Structural recursion:** recursive calls are made on *structurally smaller* arguments.

2. **Tail recursion:** the recursive call is the *last thing* that happens.

There is no requirement that the tail recursion should be called on a smaller argument. In fact, quite often tail recursive functions are *designed* to loop forever. For example, here's a trivial tail recursion (not very useful, but it is tail recursion):

    def f(x):
       return f(x+1)

We actually have to be a bit more careful. There may be several recursive calls in a function, and not all of them need to be tail recursive:

    def g(x):
      if x < 0:
        return 42             # no recursive call
      elif x < 20:
         return 2 + f(x - 2)  # not tail recursive
      else:
         return f (x - 3)     # tail recursive

One speaks of *tail recursive calls*. A function whose recursive calls are **all** tail-recursive is then called a tail-recursive function.