a8541695 发表于 2020-3-1 11:07:27

欧几里得求最大公约数报错

def gcd (x,y):
    while x%y== 0 :
      a = y
      y = x% y
      x = a
    return (a)

报错Traceback (most recent call last):
File "<pyshell#0>", line 1, in <module>
    gcd (2,4)
File "C:\Users\000\AppData\Local\Programs\Python\Python38\爱因斯坦计算题处理方法.py", line 6, in gcd
    return (a)
UnboundLocalError: local variable 'a' referenced before assignment

原因是什么啊,求解答

蒋博文 发表于 2020-3-1 11:23:32

def gcd(x, y):
    while y:
      a = x % y
      x = y
      y = a

    return x
帮你改好了你的错误原因是运用了局部变量a

蒋博文 发表于 2020-3-1 11:27:26

还有,你为什么要写x % y == 0呢,这样写是不对的

蒋博文 发表于 2020-3-1 11:28:39

因为这样写,只有当x % y == 0 时才会运行while的语句,否则直接返回x的值

jackz007 发表于 2020-3-1 11:29:43

本帖最后由 jackz007 于 2020-3-1 11:40 编辑

    while x%y== 0 :
      a = y
      y = x% y
      x = a
      局部变量 a 的作用域仅限于 while 循环内部,在循环以外失效。
      由于语句
    return (a)
      不在 while 循环以内,所以,会产生 “变量 a 没定义” 的错误
      其实,可以不用临时变量
def gcd (x , y):
    while y :
      x , y = y , x % y
    return x

a8541695 发表于 2020-3-1 12:01:29

jackz007 发表于 2020-3-1 11:29
局部变量 a 的作用域仅限于 while 循环内部,在循环以外失效。
      由于语句



您好
x , y = y , x % y
这个语句是同时赋值的嘛,会不会因为x 先被赋值了y, y的计算结果被改变?

a8541695 发表于 2020-3-1 12:04:49

蒋博文 发表于 2020-3-1 11:23
帮你改好了你的错误原因是运用了局部变量a

谢谢!

jackz007 发表于 2020-3-1 12:09:43

a8541695 发表于 2020-3-1 12:01
您好
x , y = y , x % y
这个语句是同时赋值的嘛,会不会因为x 先被赋值了y, y的计算结果被改变?

       你多虑了,这个表达式所有变量的赋值是同时进行的,没有先后顺序,完全就是我们所希望的效果。

a8541695 发表于 2020-3-1 12:16:55

jackz007 发表于 2020-3-1 12:09
你多虑了,这个表达式所有变量的赋值是同时进行的,没有先后顺序,完全就是我们所希望的效果。

十分感谢
页: [1]
查看完整版本: 欧几里得求最大公约数报错