繁体   English   中英

Python函数编程:最小的数字可被数字1到20整除

[英]Functional Programming Python: smallest number divisible by each of the numbers 1 to 20

我想使用它的功能编程功能在python中建立一个while循环,但是直到现在我还是失败了。

我已经实现了这种代码和平的功能,它应该计算出最小的数字,该数字可以被数字1到20整除。但是似乎并没有大量使用函数式编程功能。 而且还给我以下错误:

“ RuntimeError:超过最大递归深度”在增量“ i”的行中;

即使应限制为20。

def byYmult(x, y): return x % y == 0
def first20div():
    i=0
    for y in range(1,20):
        i += byYmult(x, y)
    return i >= 20

def while_block():
    global x
    if first20div(): 
        print(x)
        return 1
    else:
        x += 1
    return 0

x = 0
while_FP = lambda: ((not first20div()) and while_block() ) or while_FP()
while_FP() 

这是非功能性的,原因有很多:

  1. 您不通过也不返回函数;
  2. 您只需在底部构造一个命名的lambda表达式,但这通常被认为是非Python的
  3. 通常,函数式编程意味着您不更改数据,但在此处定义要更新的global x
  4. 一些全局变量也将其视为非功能性的:所有数据都应传递给功能性。

因此,有很多工作要做。 此外,您描述的算法不是很理想。 与其执行不断猜测数字直到最终获得幸运的蛮力方法,一种更好的方法是计算数字1..20的最小公倍数(LCM)

我们可以首先定义-以功能方式-首先可以通过计算最大公共除法器(GCD)来计算LCM,这可以通过欧几里得算法来完成。 对我们来说幸运的是,它已经在math包中:

from math import gcd

现在,LCM为:

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

可以通过计算前两个数字的LCM,然后将其作为第一个参数传递给具有第三个数字的LCM或更正式地计算三个或更多数字的LCM:

lcm(x,y,z) == lcm(lcm(x,y),z)

这可以通过使用来自functools reduce来完成:

from functools import reduce

def lcm_multiple(xs):
    return reduce(lcm, xs)

现在我们可以通过将range(2,20)对象传递给它来计算答案:

answer = lcm_multiple(range(2, 20))

或全部:

from math import gcd
from functools import reduce

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

def lcm_multiple(xs):
    return reduce(lcm, xs)

answer = lcm_multiple(range(2, 20))

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM