【问题标题】:The greatest common divisor of two positive integers pythonpython 两个正整数的最大公约数
【发布时间】:2017-11-08 13:16:56
【问题描述】:
def mike(a,b):
    d=min(a,b)
    e=d
    if max(a,b)%d==0 and e%d==0:
        return d
    else:
        return mike(max(a,b),d-1)
print(mike(12,18))

我找不到将“e”的值作为两个整数中最小值的固定值的方法,如果是 12。随着代码的继续,“e”的值也会随之变化。但我希望它具有两者中最小的固定值。对不起菜鸟问题。请帮忙。

【问题讨论】:

  • 在 Python 3 中,您可以使用 math.gcd(a,b) 来获取 gcd。还是您想编写自己的版本?
  • e%d==0 始终是true
  • 使用d-1 真的没有意义。考虑gcd(12, 7)。这将与 gcd(12, 6) 递归,即 6,而答案应该是 1。
  • (1) 我只是解释了怎么做,(2) 你不能那样计算 gcd,除非你把它作为第三个没有用的参数传递。跨度>

标签: python python-3.x


【解决方案1】:

我不明白你为什么设置 e=d 以及为什么需要 d-1 进行递归

def mike(a,b):
    rest = max(a, b) % min(a, b)
    if rest == 0:
        return min(a, b)
    else:
        return mike(min(a, b), rest)

gcd 的计算。

(48,30)

用最小的除以最大的,得到其余的。 48 / 30 = 1(其余 18 个)

将前一个除数除以其余除数 30 / 18 = 1(其余 12)

再次将前一个除数除以其余除数 18 / 12 = 1(其余 6)

再次将前一个除数除以其余除数 12 / 6 = 2(其余 0)

gcd 是 rest == 0 时的除数

【讨论】:

    【解决方案2】:

    所以你不需要函数,你可以添加 e 作为可选参数

    def mike(a,b,e=None):
        d=min(a,b)
        if not e:
            e=d
        if max(a,b)%d==0 and e%d==0:
        return d,e
        else:
            return mike(max(a,b),d-1,e)
    print(mike(12,18))
    

    这样你可以递归调用它,并且仍然跟踪和输出原始函数的最小值

    【讨论】:

    • 缩进 "return d,e" 为什么要返回 2 个值?
    • 抱歉,我是早上 8 点在喝咖啡前写的。它需要大量的编辑,return e 显示了结果。
    【解决方案3】:

    我最终还是这样做了。感谢所有的答案。我知道我让它变得更复杂了。

    def mike(x,y):
        e=min(x,y)
        def mi(a,b):
            d=min(a,b)
            if max(a,b)%d==0 and e%d==0:
                return d
            else:
                return mi(max(a,b),d-1)
        zz=mi(x,y)
        return zz
    
    print(mike(12,18))
    

    【讨论】:

      猜你喜欢
      • 2020-04-17
      • 2022-11-27
      • 2020-12-07
      • 1970-01-01
      • 2021-04-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多