代码之家  ›  专栏  ›  技术社区  ›  iljyya

无法理解“def gcd()”的代码

  •  1
  • iljyya  · 技术社区  · 13 年前

    更新: 曾经我不知道 3 %4 =0 ...

    def gcd(a, b):
        """Calculate the Greatest Common Divisor of a and b.
    
        Unless b==0, the result will have the same sign as b (so that when
        b is divided by it, the result comes out positive).
        """
        while b:
            a, b = b, a%b
        return a
    

    我认为它是这样工作的:

    gcd(3,4) => while 4: => 3,4 = 4, 3%4 => 
    
    2 回复  |  直到 10 年前
        1
  •  6
  •   Community Mohan Dere    8 年前

    让我们一步一步地完成这个过程。

    def gcd(a, b):
    

    这定义了一个新功能 gcd 它使用变量 a b 在其计算中。必须在函数开始之前设置这些值。

    while b:
    

    除非一个数字等于0,否则它被认为是真的。所以,如果 b =0,那么这部分代码 将不会执行。

     a, b = b, a%b
    

    为了清楚起见,我将把它扩展到两行。

    a = b
    b = a%b
    

    第一部分是不言自明的,第二部分显然不是。 a%b 是的python表达式 a (mod b) 模是数学函数,在其最基本的状态下,返回两个数字的余数。例如, 12%5 = 2 ; 的剩余部分 12/5 是2。

    不过,在编写实际代码时,请确保将它们放在同一行。在一行中,赋值同时发生(由元组打包和拆包提供)。在两行中,分配一个接一个地发生,这给出了错误的答案(b将始终为0)- Tim

    这些行无限期重复,直到变量 b 等于0。之后,代码执行以下操作:

    return a
    

    返回值 到程序的其余部分,以便以后可以使用。它也结束了函数。

    阅读更多关于欧几里得方程的内容 密码学和数学,“扩展版”)转到 this Wikipedia page.

    我希望这能有所帮助!

        2
  •  1
  •   David Greydanus    11 年前

    这里是gcd函数的递归版本。

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