The standard structural recursive formula (and the one you'd use if you were using a functional language like Scheme) would be to deconstruct the list recursively:
func([]) => nothing
func([x, ...]) => do_stuff(x), func([...])
Therefore, the "functional" way to do this would be to take a single list (not an index), and to recurse on smaller lists:
def rec_list(l):
if not l: return # empty list case
# process l[0]
return rec_list(l[1:])
Note that this is terribly, terribly inefficient because of the l[1:], but it's the basis for understanding more complex recursive constructs (e.g. recursing on binary trees).
We can do interesting things with this kind of structural recursion. For example, here's how you'd reverse a list in a functional language:
def rev_list(l):
if not l: return []
return rev_list(l[1:]) + [l[0]]
(Of course, you could just do l[::-1] in Python, but here we're trying to show how it would be done recursively).