鱼C论坛

 找回密码
 立即注册
查看: 2678|回复: 11

017/022课求最大公约数的答案没看懂

[复制链接]
发表于 2016-10-20 05:55:43 | 显示全部楼层 |阅读模式

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

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

x
1、22课 递归
def gcd(x,y):
   if y:
       return gcd(y,x%y)   -------请问这里不是返回(x,y)的形式吗?为什么会是取最大公约数呢?
   else:
       return x

print(gcd(113,6))
2、17课 乐高积木
def gcd(x, y):
    while y:
        t = x % y         (t是x除以y的余数看懂了,后面为什么x = y,y =t呢?)
        x = y
        y = t

    return x
   
print(gcd(4, 6))

请问两种求值方法有啥异同点,能够详细解释下取值的过程吗?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2016-10-20 10:18:24 | 显示全部楼层
递归的思想对我们这种初学者来说真是 有点点难,我认为重点在于找到可递归的规律吧。
满足递归有两条件,一是函数自身调用自己,二是有能够结束的条件。

你可以先搞懂第二种,再来看第一种应该就不会那么乱了。
你说x=y,y=t不明白,那些有编程经验的人一看,应该就知道这不过是两个值交换的一惯做法。
像我们这种初学者就要一步一步走过程,比如说先调用方法
gcd(4,6),传入的值,x等于4,y等于6
while y: (这时y是6,非0为True,进入循环)
t= x%y  ( t等于4%6,也就t等于4)
x = y  (x等于6)
y = t   (y等于4)

while y: (这时y是4,进入循环)
t= x%y  ( t等于6%4,也就t等于2)
x = y  (x等于4)
y = t   (y等于2)

while y: (这时y是2,进入循环)
t= x%y  ( t等于4%2,也就t等于0)
x = y  (x等于2)
y = t   (y等于0)

while y: (这时y是0,退出循环)
t= x%y    (x等于2,这里不会执行了)
x = y
y = t

return x; (这时x等于2)



至于递归那里 你说返回 (x,y )形式,也不是不可以,可以改成像2那样
def gcd(x,y):
   if y:
       t = x % y
       x = y
       y = t
       return gcd(x,y)  
   else:
       return x

既然能够简化程序,何必写那么多行是吧。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 4 反对 0

使用道具 举报

 楼主| 发表于 2016-10-20 20:34:57 | 显示全部楼层
本帖最后由 changhaitian 于 2016-10-20 20:36 编辑
谢家进 发表于 2016-10-20 10:18
递归的思想对我们这种初学者来说真是 有点点难,我认为重点在于找到可递归的规律吧。
满足递归有两条件, ...


谢谢你的细心解答,根据你的解答,我把思路重新整理了一遍。
作为初学者,我觉得搞清楚基本的概念非常重要,比如说迭代的概念,函数的赋值方法。
其实递归也是循环的一种,不过更强调的是对函数本身的调用?
第十七课 方法一,求最大公约数:
def gcd(x,y):
    while y:(在y循环中)
        t = x%y (t是x除以y的余数)
        x = y (把y的值赋予x)
        y = t (把余数t的值赋予y)
当 x = 4, y = 6时:
    进入y循环,
        t = x%y = 4
        x = y = 6
        y = t = 4
    再进入y循环,现在x = 6,y = 4:
        t = x%y = 2
        x = y = 4
        y = t = 2
     又再次进入y循环,x = 4 ,y =2
        t = x%y = 0
        x = y = 2
        y = t = 0
     因为 y = 0 为 false,循环终止
      
       return x (取第三次循环y 的值2)
      
       所以,(x,y)的最大公约数为 2
第十九课 方法二: 递归的思想
递归满足两个条件: 1、函数自己调用自己。2有正确的结束的条件。
def gcd(x,y):
       if y:(如果y != 0)
           return gcd (y,x%y)  返回,让 x = y,且 y = x%y (y取值x%y的余数)
          相当于, t = x%y,x = y, y =t
      else:(如果 y ==0)
           return x (返回最后一次阶乘中x的值,x就是原两数的最大公约数)

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-10-21 17:58:40 | 显示全部楼层
醍醐灌顶啊
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-10-24 09:02:31 | 显示全部楼层
学习了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-1-13 14:40:31 | 显示全部楼层
瞬间明白了,谢谢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-1-13 19:25:13 | 显示全部楼层
涨知识了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-1-15 22:53:21 | 显示全部楼层
谢家进 发表于 2016-10-20 10:18
递归的思想对我们这种初学者来说真是 有点点难,我认为重点在于找到可递归的规律吧。
满足递归有两条件, ...

牛逼答主,,,为你点赞!!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-1-15 22:57:00 | 显示全部楼层
醍醐灌顶啊
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-8-30 07:40:40 | 显示全部楼层
想问下 为什么要设成return x
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-11-18 20:50:09 | 显示全部楼层
本帖最后由 还是鱼头好 于 2018-7-4 20:41 编辑
changhaitian 发表于 2016-10-20 20:34
谢谢你的细心解答,根据你的解答,我把思路重新整理了一遍。
作为初学者,我觉得搞清楚基本的概念非常 ...


艰难理解中……以及顺道为22课答案解答马一下QAQ

终于艰难地再次看到22课
大致理解了22课这一题的思路
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-1-20 15:18:07 | 显示全部楼层
mark,终于懂了!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-20 18:14

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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