鱼C论坛

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

[已解决]求最大公约数问题为什么return没有返回值

[复制链接]
发表于 2018-9-16 18:54:33 | 显示全部楼层 |阅读模式

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

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

x
  1. def gcd(x,y):
  2.     r=x%y
  3.     if r==0:
  4.         #print('%d和%d的最大公约数为:%d'%(x,y,y))
  5.         return y   
  6.     else:
  7.         n=y%r
  8.         if n==0:
  9.             #print('%d和%d的最大公约数为:%d'%(x,y,r))
  10.             return r
  11.         else:
  12.             gcd(r,n)
  13.          
复制代码

求教各位大神:小白在做课后习题的时候自己写了这段代码,print里面的那句话可以正常打印,但是却没有返回值,测试了下返回值是None,这是为什么呢
最佳答案
2018-9-16 19:59:31
我详细解释一下吧,我添加了几个语句,运行结果如下 QQ图片20180916195302.png
  1. def gcd(x,y):
  2.     r=x%y
  3.     if r==0:
  4.         print('r')
  5.         print('%d和%d的最大公约数为:%d'%(x,y,y))
  6.         return y
  7.     else:
  8.         n=y%r
  9.         if n==0:
  10.             print('2',r,n)
  11.             print('%d和%d的最大公约数为:%d'%(x,y,r))
  12.             return r
  13.         else:
  14.             print('1',r,n)
  15.             return gcd(r,n)
复制代码


呃,代码。。
代码的问题出现在你递归之后没有归去来兮,递了之后没有返回,所以在最后一次递归满足条件后就删了,可能内存占用问题?或者命名空间问题?命名空间的问题可能性比较大,就是python找不到你这个y值究竟是指哪一个y,返回到哪里,但是又需要一个对象,然后就赋值了none,这点儿可以看出python还是很人性化的。你在加入return之后值会返回回来,代码就补充完整了。另外你的print语句地方有点问题,可以修改一下。
捕获.PNG
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2018-9-16 19:09:57 From FishC Mobile | 显示全部楼层
else:
    return gcd()  少了 return
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-9-16 19:10:39 | 显示全部楼层
最后return gcd(r,n)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-9-16 19:59:31 | 显示全部楼层    本楼为最佳答案   
我详细解释一下吧,我添加了几个语句,运行结果如下 QQ图片20180916195302.png
  1. def gcd(x,y):
  2.     r=x%y
  3.     if r==0:
  4.         print('r')
  5.         print('%d和%d的最大公约数为:%d'%(x,y,y))
  6.         return y
  7.     else:
  8.         n=y%r
  9.         if n==0:
  10.             print('2',r,n)
  11.             print('%d和%d的最大公约数为:%d'%(x,y,r))
  12.             return r
  13.         else:
  14.             print('1',r,n)
  15.             return gcd(r,n)
复制代码


呃,代码。。
代码的问题出现在你递归之后没有归去来兮,递了之后没有返回,所以在最后一次递归满足条件后就删了,可能内存占用问题?或者命名空间问题?命名空间的问题可能性比较大,就是python找不到你这个y值究竟是指哪一个y,返回到哪里,但是又需要一个对象,然后就赋值了none,这点儿可以看出python还是很人性化的。你在加入return之后值会返回回来,代码就补充完整了。另外你的print语句地方有点问题,可以修改一下。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-9-16 21:04:34 | 显示全部楼层
RIXO 发表于 2018-9-16 19:59
我详细解释一下吧,我添加了几个语句,运行结果如下

感谢您的回答我print语句是为了要看下x,y 的值为多少,是否已经赋值进去,
  1. if r==0:
  2.         print('%d和%d的最大公约数为:%d'%(x,y,y))
  3.         return y   
复制代码

这段代码里面的x,y都已经得到最后的一次运算值12,6, 但是接下来的return y 却没有返回6
我不知道我这么理解是否正确,我是这么想的,最后一次调用
  1. else:
  2.             gcd(r,n)
  3.          
复制代码

是不是就相当于
  1. else:
  2.             gcd(12,6)
  3.          
复制代码

接下来带入gcd(12,6)执行
  1. r=12%6
  2.     if r==0:
  3.         print('%d和%d的最大公约数为:%d'%(12,6,6))
  4.         return 6
复制代码

也就是说我得到一个返回的y代码就变成
  1. def gcd(x,y):
  2.     r=x%y
  3.     if r==0:
  4.         return y   
  5.     else:
  6.         n=y%r
  7.         if n==0:
  8.             return r
  9.         else:
  10.             6
  11.          
复制代码
所以就是即使我得到了6 但也没有return  6 这样的语句 所以即使得到了也没有返回值所以得到了None,所以必须在递归开始的时候加上return 变成return gcd(r,n)也就是return 6 ,所以最后得到了返回值
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-9-16 21:06:10 | 显示全部楼层

非常感谢您的帮助
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-9-16 21:06:56 | 显示全部楼层
claws0n 发表于 2018-9-16 19:09
else:
    return gcd()  少了 return

非常感谢您的帮助
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-9-16 21:12:04 | 显示全部楼层
MrClown 发表于 2018-9-16 21:04
感谢您的回答我print语句是为了要看下x,y 的值为多少,是否已经赋值进去,
这段代码里面的x,y都已经得到 ...

嗯,你理解的很正确
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-9-16 21:14:10 | 显示全部楼层
RIXO 发表于 2018-9-16 21:12
嗯,你理解的很正确

非常感谢您的帮助
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-3-29 18:41

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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