[英]Program to find the smallest number evenly divisible by all numbers from 1 to 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()
这是非功能性的,原因有很多:
global x
; 因此,有很多工作要做。 此外,您描述的算法不是很理想。 与其执行不断猜测数字直到最终获得幸运的蛮力方法,一种更好的方法是计算数字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.