鱼C论坛

 找回密码
 立即注册
查看: 2142|回复: 5

[已解决]递归...好难懂 感觉怎么都转不过弯

[复制链接]
发表于 2017-7-12 00:37:08 | 显示全部楼层 |阅读模式

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

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

x
出自22讲的递归作业 完全。。看不懂。。。

4 6赋值给x,y 然后返回一个把x赋值给y, x求余y赋值给y的自己  然后......啥??
普通的用循环也能解决这个问题...吧? 顺带视频里的叠罗汉也是“原来如此,不懂。”的状态..

1. 使用递归编写一个函数,利用欧几里得算法求最大公约数,例如 gcd(x, y) 返回值为参数 x 和参数 y 的最大公约数。

        1. def gcd(x, y):

        2.     if y:

        3.         return gcd(y, x%y)

        4.     else:

        5.         return x

        6.     

        7. print(gcd(4, 6))
最佳答案
2017-7-12 00:49:20
本帖最后由 yongxi 于 2017-7-12 00:51 编辑

始终你要明白。 gcd(x,y)有两个形参,就是x和y   无论怎么变, 第一个形参是x 第二个形参是y
gcd(y,x%y)  就是把y赋值给形参x  把x%y赋值给形参y
if y 的意思就是 只要y不为0 就一直递归  那么就是把上一次得到的 y 和 x%y作为形参调用函数本身
就这么一直循环,一直循环~~
直到y等于0了。 就执行else return 形参x
循环也是可以解决的,但是你没发现这个题目用递归就这么几句代码就搞定了,你用其他循环就显得麻烦了么?


总体来说就是用参数的运算作为参数再调用本身  这是最基本最简单的递归
对于递归你要学会逆向思维和逻辑想象
这还是一个最简单的例子,还有更烧脑的递归。
抽象的东西,就得靠你自己去想明白。比如我懂我知道,我按照自己的理解给你说,打了这么多字你也未必懂。自己加油思考吧。
最后再说一次小甲鱼老师的话,递归的本质就是无限调用函数本身,直到达到你设置的停止条件,然后返回。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2017-7-12 00:49:20 | 显示全部楼层    本楼为最佳答案   
本帖最后由 yongxi 于 2017-7-12 00:51 编辑

始终你要明白。 gcd(x,y)有两个形参,就是x和y   无论怎么变, 第一个形参是x 第二个形参是y
gcd(y,x%y)  就是把y赋值给形参x  把x%y赋值给形参y
if y 的意思就是 只要y不为0 就一直递归  那么就是把上一次得到的 y 和 x%y作为形参调用函数本身
就这么一直循环,一直循环~~
直到y等于0了。 就执行else return 形参x
循环也是可以解决的,但是你没发现这个题目用递归就这么几句代码就搞定了,你用其他循环就显得麻烦了么?


总体来说就是用参数的运算作为参数再调用本身  这是最基本最简单的递归
对于递归你要学会逆向思维和逻辑想象
这还是一个最简单的例子,还有更烧脑的递归。
抽象的东西,就得靠你自己去想明白。比如我懂我知道,我按照自己的理解给你说,打了这么多字你也未必懂。自己加油思考吧。
最后再说一次小甲鱼老师的话,递归的本质就是无限调用函数本身,直到达到你设置的停止条件,然后返回。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2017-7-12 09:15:13 | 显示全部楼层
2017-07-12_091321.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-7-12 11:19:06 | 显示全部楼层
我看楼主的帖子的时候直接看的代码(看了帖子题目知道是在问递归的问题),然后就点蒙,完全没想到这是在求最大公约数
然后我就想问,当看其他大神这种包含各种算法的代码时,怎么确定作者用这段代码想要实现的功能?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-7-12 15:25:01 | 显示全部楼层
本帖最后由 yongxi 于 2017-7-12 15:27 编辑
Neo_367 发表于 2017-7-12 11:19
我看楼主的帖子的时候直接看的代码(看了帖子题目知道是在问递归的问题),然后就点蒙,完全没想到这是在求 ...


有备注的看备注,没备注的只能一行一行慢慢看,没其他办法

或者你先把代码跑一遍看看运行结果,然后再一行一行看代码如何得到结果。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-7-12 15:59:30 | 显示全部楼层
Neo_367 发表于 2017-7-12 11:19
我看楼主的帖子的时候直接看的代码(看了帖子题目知道是在问递归的问题),然后就点蒙,完全没想到这是在求 ...

这个叫“辗转相除法”,求最大公约数基本的方法之一,这些程序对应的理论都有数学公式支撑的。

你如果想要理解程序的本质,最好的办法就是先弄懂背后的数学逻辑,然后写出数学的递归公式,再写递归程序就很简单了。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-28 23:37

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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