The recursion depth problem is because div is new with each local context. It is not a global variable. Every time you enter the routine, you get a new context, including a new set of local variables. Thus, if you have n = 7, every call sets div = 6. You never change that, so you go into infinite recursion.
You need to adopt a cleaner solution, such as those suggested by the other posters.
Here is your code, using a global div. Note that you have to reset it after every completion ... somehow ... and it's ugly ...
div = -1
def is_prime4(n):
"""Recursive primality test"""
global div
if div < 0:
div = n - 1
else:
div = div - 1
while div >= 2:
if n % div == 0:
print 'No, {number} is not prime because it is divisible by {div}.'.format(number = n, div = div)
div = -1
return False
else:
return is_prime4(n)
else:
print 'Yes, {number} is prime indeed.'.format(number = n)
div = -1
return True
for i in range(20):
is_prime4(i)
Output:
Yes, 0 is prime indeed.
Yes, 1 is prime indeed.
Yes, 2 is prime indeed.
Yes, 3 is prime indeed.
No, 4 is not prime because it is divisible by 2.
Yes, 5 is prime indeed.
No, 6 is not prime because it is divisible by 3.
Yes, 7 is prime indeed.
No, 8 is not prime because it is divisible by 4.
No, 9 is not prime because it is divisible by 3.
No, 10 is not prime because it is divisible by 5.
Yes, 11 is prime indeed.
No, 12 is not prime because it is divisible by 6.
Yes, 13 is prime indeed.
No, 14 is not prime because it is divisible by 7.
No, 15 is not prime because it is divisible by 5.
No, 16 is not prime because it is divisible by 8.
Yes, 17 is prime indeed.
No, 18 is not prime because it is divisible by 9.
Yes, 19 is prime indeed.