Код ниже дает мне бесконечную ошибку рекурсии!

count1 = 1
def lcm(a,b):
    global count1
    if a%2==0 and b%2==0:
        count1*=2
        return lcm(a%2,b%2)

    elif a%3==0 and b%3==0:
        count1*=3
        return lcm(a%3,b%3)

    else:
        return count1*a*b

print(lcm(12,24))

Как я могу это исправить?

0
Souvik Ray 27 Май 2017 в 21:02

2 ответа

Лучший ответ

На первой итерации a%2 равен нулю (12% 2), как и b%2 (24% 2).

Теперь вы удвоили count1. И затем вы вызываете lcm с параметрами (0, 0) (потому что, как уже установлено, 12 % 2 == 0 and 24 % 2 == 0).

Далее мы делаем 0 % 2, что равно 0. И тогда цикл продолжается вечно.

Код для лучшего решения:

def gcd(x, y):
   # This is the Euclidian algorithm for getting the highest
   # common factor (greatest common denominator) of two numbers
   while y != 0:
       x, y = y, x % y
   return x

def lcm(x, y):
   lcm = (x*y)//gcd(x,y)
   return lcm


print(lcm(12, 24))

Источник

1
Frogboxe 27 Май 2017 в 19:43

Не очень понятно, как вы собираетесь реализовать lcm, но, насколько я понимаю,

# lowest common multiple
# where gcd = greatest common divisor
lcm(m,n) = m * n / gcd(m,n)

С этим мы можем легко реализовать lcm

def gcd (m,n):
  if n == 0:
    return m
  else:
    return gcd(n, m % n)

def lcm (m,n):
  return m * n / gcd(m,n)

print(lcm(12,24)) # 24
1
Thank you 27 Май 2017 в 20:11