【问题标题】:Functional Programming Python: smallest number divisible by each of the numbers 1 to 20函数式编程 Python:可被 1 到 20 中的每一个整除的最小数
【发布时间】:2018-04-30 01:24:53
【问题描述】:

我想使用 Python 的函数式编程功能在 Python 中构建一个 while 循环,但直到现在我都失败了。

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

“运行时错误:超出最大递归深度”在“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() 

【问题讨论】:

  • 你已经问过一次这个问题了。但是错误不言自明:您对迭代的每个元素执行递归。解决方案>1G。所以堆栈正在建立。请注意,使用全局变量实际上几乎肯定不起作用。由于函数式编程通常适用于不可变数据。
  • @WillemVanOnsem 我不明白你的回答。我执行递归来增加我正在寻找的数字,迭代(for循环)是条件检查部分(即了解我是否必须停止递归)。
  • 你在哪里看到任何递归?
  • 什么是byYmult()?请将此设为minimal reproducible example。此外,如果使用 for 循环,代码似乎也不是很实用。

标签: python recursion functional-programming


【解决方案1】:

由于很多原因,这不起作用:

  1. 你没有传递,也没有返回函数;
  2. 你只在底部构造了一个命名的 lambda 表达式,但这通常被认为是 un-Pythonic;
  3. 通常函数式编程意味着您不更改数据,但在这里您定义一个global x,您可以更新它;
  4. 一些全局变量也被视为非函数:所有数据都应传递给函数。

所以有很多工作要做。此外,您描述的算法不是很优化。与其执行我们不断猜测数字直到最终幸运的蛮力方法,更好的方法是计算数字 1..20 的最小公倍数 (LCM)

我们可以首先定义 - 以函数方式 - 我们可以通过首先计算 最大公分频 (GCD) 来计算 LCM,这可以通过 Euclidean Algorithm 来完成。幸运的是,它已经在 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)

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

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))

【讨论】:

  • 这很棒。非常感谢。
猜你喜欢
  • 2022-12-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-07-21
  • 1970-01-01
  • 1970-01-01
  • 2012-12-28
  • 2022-01-02
相关资源
最近更新 更多