鱼C论坛

 找回密码
 立即注册
查看: 1829|回复: 2

[已解决]关于第十七讲函数,求最大公约数问题的返回值问题

[复制链接]
发表于 2017-7-24 15:05:16 | 显示全部楼层 |阅读模式

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

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

x
作业要求是编写一个函数,利用欧几里得算法求最大公约数

  1. >>> def gcd(a,b):
  2.         if a<b:
  3.                 a,b=b,a
  4.         k=a%b
  5.         if k==0:
  6.                 print(b)
  7.                 return b
  8.         else:
  9.                 gcd(b,k)

  10. >>> gcd(12,4)
  11. 4
  12. 4
  13. >>> gcd(3,1)
  14. 1
  15. 1
  16. >>> gcd(5,3)
  17. 1
  18. >>>
复制代码

这是我编写的求最大公约数的函数,可是有一个问题,为什么当求5和3的最大公约数时,只能通过print(b)这个语句打印初1,而return b 这个语句就不起作用了,其他时候,return b的语句都会有作用。谢谢各位大神帮忙看看。
最佳答案
2017-7-24 16:19:16
本帖最后由 和vvv 于 2017-7-24 16:24 编辑

因为前面两个gcd(12,4)和gcd(3,1)都没有递归调用,直节在这一步结束程序:
  1. if k==0:
  2.                 print(b)
  3.                 return b
复制代码

所以会有返回值。而gcd(5,3)第一次k = 5 % 3 = 2,不为零,因此递归调用gcd(3,2),一直调用,直到k=0。这是返回值b=1。但是递归调用并没有结束,还有一个回溯过程。现将这个返回值传到上一层,一直到最后。所以最后的返回值在else下的函数中,因此,这样可以保证能够有返回值:
  1. def gcd(a, b):
  2.     if a < b:
  3.         a, b = b, a
  4.     k = a % b
  5.     if k == 0:
  6.         print(b)
  7.         return b
  8.     else:
  9.         w = gcd(b, k)
  10.         return w


  11. f = gcd(5, 3)
  12. print(f)
复制代码


而如果还是你那种写法,遇到递归调用的情况,最终的返回值保存在这里:
  1. else:
  2.                 gcd(b,k)
复制代码

但并没有return语句,因此会返回空,也就是None。这就是为什么gcd(5,3)没有打印出返回值的原因。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2017-7-24 16:19:16 | 显示全部楼层    本楼为最佳答案   
本帖最后由 和vvv 于 2017-7-24 16:24 编辑

因为前面两个gcd(12,4)和gcd(3,1)都没有递归调用,直节在这一步结束程序:
  1. if k==0:
  2.                 print(b)
  3.                 return b
复制代码

所以会有返回值。而gcd(5,3)第一次k = 5 % 3 = 2,不为零,因此递归调用gcd(3,2),一直调用,直到k=0。这是返回值b=1。但是递归调用并没有结束,还有一个回溯过程。现将这个返回值传到上一层,一直到最后。所以最后的返回值在else下的函数中,因此,这样可以保证能够有返回值:
  1. def gcd(a, b):
  2.     if a < b:
  3.         a, b = b, a
  4.     k = a % b
  5.     if k == 0:
  6.         print(b)
  7.         return b
  8.     else:
  9.         w = gcd(b, k)
  10.         return w


  11. f = gcd(5, 3)
  12. print(f)
复制代码


而如果还是你那种写法,遇到递归调用的情况,最终的返回值保存在这里:
  1. else:
  2.                 gcd(b,k)
复制代码

但并没有return语句,因此会返回空,也就是None。这就是为什么gcd(5,3)没有打印出返回值的原因。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-7-24 19:27:47 | 显示全部楼层
和vvv 发表于 2017-7-24 16:19
因为前面两个gcd(12,4)和gcd(3,1)都没有递归调用,直节在这一步结束程序:

所以会有返回值。而gcd(5,3) ...

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-2-28 23:53

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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