In [1]:
# a function can call itself.

seq = range(10)
seq


Out[1]:
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

In [2]:
s = 0
for i in seq:
    s += i
s


Out[2]:
45

In [3]:
def seq_sum(seq):
    if not seq:
        return 0
    else:
        return seq[0] + seq_sum(seq[1:])
    
seq_sum(seq)


Out[3]:
45

In [7]:
def seq_sum(seq):
    print 'In seq_sum with %s' % str(seq)
    if not seq:
        print 'Exiting seq_sum with 0'
        return 0
    else:
        print 'First element of seq is %g' % seq[0]
        print 'Calling seq_sum with %s' % str(seq[1:])
        ss = seq_sum(seq[1:])
        print 'Returned from seq_sum of %s, got %g' % (str(seq[1:]), ss)
        result = seq[0] + ss
        print 'Adding %g to %g gives %g' % (seq[0], ss, result)
        print 'Returning %g from seq_sum' % result
        return result

seq = [1, 2]
seq_sum(seq)


In seq_sum with [1, 2]
First element of seq is 1
Calling seq_sum with [2]
In seq_sum with [2]
First element of seq is 2
Calling seq_sum with []
In seq_sum with []
Exiting seq_sum with 0
Returned from seq_sum of [], got 0
Adding 2 to 0 gives 2
Returning 2 from seq_sum
Returned from seq_sum of [2], got 2
Adding 1 to 2 gives 3
Returning 3 from seq_sum
Out[7]:
3