I never actually use recursion while doing any practical programming, but I like to practice it sometimes. Part of the reason for not utilizing it is I barely know how it works sometimes. I can follow the stack diagram to a point, but eventually my brain explodes from the complexity of it.
Anyway, I decided to see if I could create a merge sort function with Python. I always that that this was a particularly elegant solution for sorting a list. First, I write a simple merge function that will merge two already ordered lists into one ordered list.
def merge(L1, L2):
""" merges two ordered lists
into one ordered list """
ans = []
while len(L1) != 0 and len(L2) != 0:
if L1[0] <= L2[0]:
ans.append(L1.pop(0))
else:
ans.append(L2.pop(0))
if len(L1) > 0:
ans += L1
if len(L2) > 0:
ans += L2
return ans
Now, I create a mergeSort function that uses a divide and conquer strategy. Wikipedia has a great animation that shows how this works.

Here's my mergeSort function:
def mergeSort(L):
""" Orders a list of unordered
elements with recursion """
#base case
if len(L) <= 1:
return L
mid = len(L)/2
left = mergeSort(L[:mid])
right = mergeSort(L[mid:])
return merge(left, right)
My base case returns L if the length of L is less than or equal to one because an empty list, or a list of one element, is technically ordered. The magic part is what happens when I call the mergeSort function on the left and right sides of the list. At this point I just take the so called "leap of faith" and trust that this is working as it's supposed to.