Python n个数的最小公倍数,使用递归

Python n个数的最小公倍数,使用递归,python,function,recursion,random,numbers,Python,Function,Recursion,Random,Numbers,我需要编写一个递归函数,用于查找列表中最不常见的n个长度的多个元素。 我的代码: import random def random_num(n): return [random.randint(-20,20) for i in range(n)] def gcd(a, b): if b == 0: return a else: return gcd(b, a % b) def my_nok(n,m): return (n/

我需要编写一个递归函数,用于查找列表中最不常见的n个长度的多个元素。 我的代码:

import random

def random_num(n):
    return [random.randint(-20,20) for i in range(n)]

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

def my_nok(n,m):
    return (n/gcd(n,m))*m
第一个问题是:我的函数只能处理两个参数,不能处理整个列表


第二个问题:我只需要一个函数来查找最小公倍数(我的代码中包含两个函数)。

您需要一些东西通过列表重复出现,如下面所示。如果列表中有2个元素,请执行常规LCM。如果较长,则在列表尾部重复出现,然后使用该结果和第一个元素执行LCM

def lcm(in_list):
    if len(in_list) == 2:
        # Do your normal LCM computation here
    else:
        return lcm([in_list[0], lcm(in_list[1:]))

您需要找到整个列表的LCM。假设“l”是整个数组的LCM,如果我们从数组中选取任意2个随机数,它们将有一个LCM,表示“l1”,依此类推“l2”、“l3”、“l4”。。。。这些设备的LCM也将是整个阵列的LCM

# we can find LCM of two numbers by the basic prime factorizing method
# but i will use the idea that GCD(a,b) * LCM(a,b) = a*b
# and it is easy to find the GCD(a,b)=[GCD(a,a%b)or GCD(b,b%a)] depending on if a is bigger or b
# i have used this idea because factoring large numbers take time.
所以我的想法是你可以使用分而治之

def LCM_of_array(array):
    if len(array)==2:
        return LCM(a,b)
    else:
        return LCM( LCM_of_array(n[0:len(array)/2]) , LCM_of_array(n[len(array)/2:len(array)])
您可以显式地定义LCM(a,b),或者只需在该表中添加几行代码即可

编辑:代码

def nod(a, b):   #to find GCD
   if b == 0:
      return a
   else:
    if a>b:
        return nod(b, a % b)

    else:
        return nod(a,b%a)   
def nok(a, b):    #to find LCM of two numbers
    return a * b / nod(a, b)

def nok_of_array(n):    #function for LCM of array
    if len(n) == 2:
        return nok(n[0], n[1])
    else:
        return nok (nok_of_array(n[ 0:len(n)/2 ]) , nok_of_array( n [ len(n)/2 : len(n)]))

我的代码,上一次返回不正确

import random
def nod(a, b):
   if b == 0:
      return a
   else:
      return nod(b, a % b)
def nok(a, b):
   return a * b / nod(a, b)
def nok_of_array(n):
   if len(n) == 2:
      return nok(n[1], n[2])
   else:
      return nok(nok_of_array[0:len(n)/2], nok_of_array[len(n)/2:len(n)])
n = [random.randint(-20,20) for i in range(0, random.randint(1, 20))]
print(nok_of_array(n))
print(n)

这是一个我能想出的解决方案,它对我很有效

def findDivisor(number):
    if number%2 == 0:
        return 2
    elif number%3==0:
        return 3
    return number

def LCM(nums):
    lcm = 1
    while len(nums) > 0:
        minOfnums = min(nums)
        divisor = findDivisor(minOfnums)

        for x in range(0, len(nums)):
            Quotient = nums[x]/divisor
            Reminder = nums[x]%divisor
            if Reminder == 0:
                nums[x] = Quotient

        lcm*=divisor
        minOfnums = min(nums)
        if minOfnums == 1:
            nums.remove(minOfnums)
    return lcm

非常感谢,但问题是,我不知道如何在一个函数中计算lcm,在这个示例中,我使用gcd和我的_-nok进行计算。这就是搜索引擎的用途,例如,我在答案中写了代码,你能看一下吗?错误:切片索引必须是整数或无或有一个索引方法我尝试了很多方法,但都不起作用。添加int(len(n)/2而不是len(n)/2这段代码对我有效。它给出了一个错误,该函数只在len(n)==2时起作用