# why isn't my python loop iterating? it works if gcd is = a or b but it doesn't iterate

## Question:

a, b: positive integers
returns: a positive integer, the greatest common divisor of a & b.

``````def gcdIter(a, b):

if a < b:
gcd = a
else:
gcd = b
while gcd > 0:
if a % gcd != 0 and  b % gcd != 0:
gcd -= 1
else:
return gcd
print(gcdIter(9, 12))
``````

``````def gcdIter(a, b):
if b>a:
a,b=b,a
while b:
a,b = b,a%b
return a

print(gcdIter(20,5))
``````

Your code is attempting to find GCDs in a brute force fashion by starting with the smaller of the two numbers and then working down to the GCD. This isn’t efficient, but should work. Your code decrements `gcd` if it isn’t a divisor of both. You need to decrement it if it isn’t a divisor of either. To do this, swap `and` for `or`:

``````def gcdIter(a, b):

if a < b:
gcd = a
else:
gcd = b
while gcd > 0:
if a % gcd != 0 or b % gcd != 0:
gcd -= 1
else:
return gcd
print(gcdIter(9, 12))
``````

Which prints `3`.

Having said all that, a dramatically more efficient approach is to study and implement the Euclidean Algorithm.

Categories: questions Tags: ,
Answers are sorted by their score. The answer accepted by the question owner as the best is marked with
at the top-right corner.