鱼C论坛

 找回密码
 立即注册
查看: 2445|回复: 8

[已解决]关于17章的动动手1求最大公约数

[复制链接]
发表于 2017-6-21 23:43:48 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 mm5474 于 2017-6-21 23:49 编辑

代码如下
  1. def gcd(x,y):
  2.     if x%y==0:
  3.         return y
  4.     else:
  5.         x=y
  6.         y=x%y
  7.         gcd(x,y)

  8. X = int(input('输入x值'))
  9. Y = int(input('输入y值'))

  10. print (gcd(X,Y))
复制代码


运行时候报错

  1. 输入x值6
  2. 输入y值9
  3. Traceback (most recent call last):
  4.   File "C:/Users/sunmiaoxia/Desktop/17章.1.py", line 12, in <module>
  5.     print (gcd(X,Y))
  6.   File "C:/Users/sunmiaoxia/Desktop/17章.1.py", line 7, in gcd
  7.     gcd(x,y)
  8.   File "C:/Users/sunmiaoxia/Desktop/17章.1.py", line 2, in gcd
  9.     if x%y==0:
  10. ZeroDivisionError: integer division or modulo by zero
复制代码


但是实际上x%y在else里面不可能等于0啊
为啥会报这样的错呢? 谢谢指导
最佳答案
2017-6-23 18:02:35

这样解释不知道你是否能明白
搜狗截图20170623180202.jpg
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2017-6-22 09:59:25 | 显示全部楼层
第5/6行  x = y  / y = x% y
那你这里其实运算的是  y = y % y
y = 0

解决方法  引入第三个变量
  1. def gcd (x ,y):
  2.     r = x % y
  3.     if r != 0:
  4.         x,y = y,r
  5.         gcd (x,y)
  6.     else:
  7.         print (y)
  8.         
  9. X = int (input (''))
  10. Y = int (input (''))
  11. x = max (X,Y)
  12. y = min (X,Y)

  13. gcd (x,y)
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-6-22 11:05:30 | 显示全部楼层
  1. def gcd(x,y):
  2.     if x%y==0:
  3.         return y
  4.     else:
  5.         x,y=y,x%y
  6.         gcd(x,y)
  7.         return 0

  8. X = int(input('输入x值'))
  9. Y = int(input('输入y值'))

  10. if gcd(X,Y):
  11.     print(gcd(X,Y))
  12. else:
  13.     print('X,Y无最大公约数')
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-6-23 15:52:26 | 显示全部楼层
  1. def gcd(x,y):
  2.     if x%y==0:
  3.         return y
  4.     else:
  5.         x=y
  6.         y=x%y
  7.         gcd(x,y)
复制代码

手动运行一下你这个代码
输入 x=6  y=9
进入到gcd()函数中
首先x%y不等于0,进入到else中
问题就来了,x=y,y=x%y  无论你输入的是什么最后y都等于0啊
再往下进行就会报除数为0的错了。

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-6-23 17:04:27 | 显示全部楼层
本帖最后由 mm5474 于 2017-6-23 17:07 编辑
shuofxz 发表于 2017-6-23 15:52
手动运行一下你这个代码
输入 x=6  y=9
进入到gcd()函数中


我改了一下
  1. def gcd(x,y):
  2.     print ("1",x,y,x%y)
  3.     if (x%y)==0:
  4.         return y   
  5.     else:
  6.         print ("2",x,y)
  7.         x, y =y, x%y
  8.         print ("3",x,y)
  9.         gcd(x,y)
  10.         print ("4",x,y)
  11.         return 0

  12. X = int(input('输入x值'))
  13. Y = int(input('输入y值'))

  14. print (gcd(X,Y))
复制代码


下面是输出:
  1. 输入x值8
  2. 输入y值6
  3. 1 8 6 2
  4. 2 8 6
  5. 3 6 2
  6. 1 6 2 0
  7. 4 6 2
  8. 0
复制代码


实际上在1 6 2 0这行的时候, 我的代码的第二行x%y的值就已经是0了
但是后面第三行的判断  
if (x%y)==0:
        return y  
为啥不执行而跳到了第10行执行打印4呢.

补充: 我检查了缩进, 没有发现问题 :(
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-6-23 18:02:35 | 显示全部楼层    本楼为最佳答案   

这样解释不知道你是否能明白
搜狗截图20170623180202.jpg
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-6-23 23:41:10 | 显示全部楼层
本帖最后由 mm5474 于 2017-6-23 23:45 编辑

感谢您的帮助, 我感觉我明白一些了,修改了一下
  1. def gcd(x,y):
  2.     print ("1",x,y,x%y)
  3.     while not (x%y)==0:
  4.         print ("2",x,y)
  5.         x, y =y, x%y
  6.         print ("3",x,y)
  7.         gcd(x,y)
  8.       
  9.     return y
  10.         
  11. X = int(input('输入x值'))
  12. Y = int(input('输入y值'))

  13. print (gcd(X,Y))
复制代码


现在没有问题了.
但是我还有另外一个小疑问, 就是我记得小甲鱼说过自定义方法运行到return就不会继续运行了, 难道是我记错了?
根据你的解释, 应该是我和什么类似的东西搞混了.
在一个自定义方法中, 可否有办法像break一样到某个地方强行的退出方法呢?

谢谢
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-6-24 00:36:50 | 显示全部楼层
mm5474 发表于 2017-6-23 23:41
感谢您的帮助, 我感觉我明白一些了,修改了一下

你记得没错,函数遇到return就会结束。
但是!你这个函数运用到了【递归】,也就是在一个函数中,又调用自己。
对于本例就是在gcd()函数的定义中,又使用了gcd这个函数。

还是用我上面图的那个例子说吧,左边黑色的是gcd①,右边蓝色的是gcd②,先遇到的是②中的return,把②结束了,但是①还在,就继续往下执行①。(不知道我说清楚没有=。=)

递归这块确实是不太好理解的,我也是看了很多书和例子,自己调试了很多代码,才大概把递归这部分搞清楚,这块一时半会儿弄不懂别着急,多写点代码,多调试,慢慢就能搞明白这一部分了
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-6-24 00:58:40 | 显示全部楼层
shuofxz 发表于 2017-6-24 00:36
你记得没错,函数遇到return就会结束。
但是!你这个函数运用到了【递归】,也就是在一个函数中,又调用 ...

感谢~ 真的非常感谢
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2026-2-28 04:55

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表