LCM使用递归?

时间:2015-09-22 23:14:54

标签: python recursion lcm

这是我的代码:

def lcm(a, b):
    if b == 0:
        return a
    return a * b / lcm(a, b)

print lcm(5,3)

到目前为止,这是我能管理的任何想法,如何使用递归和一个函数找到两个数字的最小公倍数(最小公倍数)?

6 个答案:

答案 0 :(得分:1)

这应该做:

# Python Program to find the L.C.M. of two input number

# define a function
def lcm(x, y):
   """This function takes two
   integers and returns the L.C.M."""

   # choose the greater number
   if x > y:
       greater = x
   else:
       greater = y

   while True:
       if((greater % x == 0) and (greater % y == 0)):
           lcm = greater
           break
       greater += 1

   return lcm


# take input from the user
num1 = int(input("Enter first number: "))
num2 = int(input("Enter second number: "))

print("The L.C.M. of", num1,"and", num2,"is", lcm(num1, num2))

答案 1 :(得分:1)

编辑:我没有在您的问题中读取递归/一个功能位,因为我很愚蠢。现已合并。

lcm不是class TrimCommandInterceptor: IDbCommandInterceptor { public void NonQueryExecuting(DbCommand command, DbCommandInterceptionContext<int> ctx) { foreach (var p in command.Parameters) { if (p.Value is string) p.Value = ((string) p.Value).Trim(); } } // Add all the other interceptor methods } ,它是a * b / lcm(a, b)(最大公约数)。

所以最简洁的方法是:

a * b / gcd(a, b)

如果你只限于递归(例如考试),那么这并不一定非常有效,所以你也可以递归计数,直到找到x和y分成的最小数字。 :

def gcd(x, y):
    while y:      
        x, y = y, x % y
    return x

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

只是增加计数器直到def lcm(x, y, counter=1): if (counter%x == 0 and counter%y == 0): return counter return lcm(x, y, counter+1) 为真,这是LCM。不要尝试使用大数字,但是你只会得到一个堆栈溢出。

答案 2 :(得分:0)

正如其他答案lcm = a*b / gcd(a, b)中所述,但您需要为其定义另一个函数gcd(a, b)

由于你只需要一个带递归的函数,也许这段代码可以用。

N.B。 :这个函数有一个额外的参数c,它应该总是作为1传递,只在函数外调用它:

def lcm(a, b, c):
d = c
m = min(a, b)
while m > 1 :
    if a%m == 0 and b%m == 0 :
        d*=m 
        return lcm(int(a/m), int(b/m), d)
    else:
        m-= 1
d*= a*b
return d

答案 3 :(得分:0)

我创建了自己的简易程序。

def lcm(greater,a,b):
# while(True):
    if (greater % a == 0 and greater % b == 0):
        lcm1 = greater
        return lcm1
    else:

        lcm1=lcm(greater + 1,a,b)
        return lcm1
a=int(input(" Enter 1st number :"))
b=int(input(" Enter 2nd number :"))
if(a>b):
  greater=a
else:
  greater=b

print(lcm(greater,a,b))

答案 4 :(得分:0)

我们有lcm(a, b) * gcd(a, b) = a * b。因此,我们可以编写以下等式:

lcm(a, b) = a; if a % b == 0
lcm(a, b) ; if a % b != 0
= a * b / gcd(a, b)
= a * b / gcd(b, a % b)
= a * b / (b * (a % b) / lcm(b, a % b))
= a / (a % b) * lcm(b, a % b)

并转换为Python,我们有:

def lcm(a, b):
  t = a % b
  if t == 0: return a
  return a * lcm(b, t) / t

答案 5 :(得分:0)

使用两个数的乘积等于这两个数的最大公除数和最小公乘数的乘积的数学关系:A * B = GCD(A,B)* LCM(A,B)

def gcd(a,b):
    if a % b == 0: return b
    return gcd(b, a % b)

def lcm(a, b):
    return ((a*b) // gcd(a,b))

第一个函数是递归的,用于查找最大公约数,它的成本为O(log(n))。