python 新手有点关于算法的困惑,比如在学习生成器的时候看到斐波拉契数列的函数真的很困惑啊,然后又有个杨辉三角的题目彻底懵逼了。。。。

2016-06-21 15:50:00 +08:00
 zpavel
http://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000/0014317799226173f45ce40636141b6abc8424e12b5fb27000#0
奉上链接,顺便问下,对这种算法真的是摸不着头脑怎么办?读读算法类的书?
5242 次点击
所在节点    Python
30 条回复
zpavel
2016-06-21 15:50:46 +08:00
求各位长者给点人生经验嘛
alphadog619
2016-06-21 15:51:54 +08:00
懵逼正常!一个知识点多看几遍,我也是初学 python
Xs0ul
2016-06-21 15:55:46 +08:00
斐波那契和杨辉三角只是单纯的定义吧?
xiahei
2016-06-21 15:57:41 +08:00
找书看,
拒绝廖雪疯,
别光看,
多练,多练,多练
多写代码,多写代码,多写代码。
学会跳, n 遍之后还不会,跳过吧,下次再来。
vinceguo
2016-06-21 16:05:52 +08:00
斐波那契和杨辉三角都搞不清么?初中生?小学生?好可怕
Chrisplus
2016-06-21 16:08:09 +08:00
先玩玩汉诺塔?
体会一下? http://www.7k7k.com/swf/335.htm
eamon666
2016-06-21 16:09:41 +08:00
吓尿
clino
2016-06-21 16:09:50 +08:00
你是让大家猜猜看你的疑惑到底在哪里是吗?
zpavel
2016-06-21 16:10:33 +08:00
@xiahei 拒绝廖雪峰?这是啥梗?
zpavel
2016-06-21 16:14:25 +08:00
@clino 额,好像是没说清楚。我的意思是,斐波拉契数列和杨辉三角规律我知道,但是表达式看的我有点晕。比如 a, b = b, a + b ,把 b 赋给 a ,再把 a+b 赋给 b (这是 b 以 a 值累加对吧?),然而合在一起就有点懵了。
zpavel
2016-06-21 16:17:19 +08:00
@Chrisplus 太感谢了,昨天确实碰到这个了。刚玩了一下,会玩,但是如果让我写出来的话,就难了。。。我想是不是我在思路这一块出了点问题。
sxmman
2016-06-21 16:17:21 +08:00
简单的算法是逻辑,复杂的算法就全是数学了。比如求两个数的最大公约数,
72 64 : mod(72, 64) = 8, mod(64, 8) = 0, so 8
88 64: mod(88, 64) = 24, mod(64, 24) = 16, mod(24, 16) = 8, mod(16, 8) = 0, so 8
xiahei
2016-06-21 16:44:13 +08:00
@zpavel
各有所爱。
practicer
2016-06-21 16:51:38 +08:00
我也是新手,要理解这几个例子前先要理解递归思想,它的根本思想是递归。而你贴的教程是为了让你理解生成器,生成器已经属于 python 编程的高级主题,因此,两点累积到一起,不懵逼才怪。另外,我不赞成用它们作为初学教程的例子,除了基础好的人,零经验的人(比如我)学的时候基本都是懵逼脸。

既然根本思想是递归,暂且不看斐波拉,先找 一个简单的递归函数来理解。
要实现一个递归函数,都需要哪些条件。 So ,先看这个简单递归函数的例子:
def fact(n):
if n == 0:
return 1
else:
return n * fact(n-1)
手动推到 fact(5)等于多少(廖大大也有这个例子)

fact(5):
由于 5 不等于 0, fact(5) = 5 * fact(4)

那么, fact(4)是多少?
fact(4):
由于 4 不等于 0, fact(4) = 4 * fact(3)

那么, fact(3)是多少?
fact(3):
由于 3 不等于 0, fact(3) = 3 * fact(2)

那么, fact(2)是多少?
fact(2):
由于 2 不等于 0, fact(2) = 2 * fact(1)

那么, fact(1)是多少?
fact(1):
由于 1 不等于 0, fact(1) = 1 * fact(0)

那么, fact(0)是多少?
fact(0):
现在, 0 等于 0, 因此 fact(0) is 1

也就是说, fact(n)的参数为零时,递归终结。

把以上的结果整合起来,得到最终结果
fact(5) = 5* fact(4)
fact(5) = 5 * 4 * fact(3)
fact(5) = 5 * 4 * 3 * fact(2)
fact(5) = 5 * 4 * 3 * 2 * fact(1)
fact(5) = 5 * 4 * 3 * 2 * 1 * fact(0)
fact(5) = 5 * 4 * 3 * 2 * 1 * 1 = 120

经过这个例子,得到实现递归函数的两个条件:
1.必须有一个终结递归的条件,专业术语叫递归出口
2.递归函数的函数体必须要调用函数自身

对照这个例子,再来看斐波拉就没那么懵逼了,这是递归版的斐波拉例子:
def fib(n):
if n > 1: return fib(n-1) + fib(n-2)
return n

最后奉劝楼主不要着急,现在看算法书没什么用的,有些算法没有遇到实际场景是很难理解的,当遇到这种例子时,不妨先放着,等你多打一些代码,多做一些项目后再来理解,到那时候理解起来便很快了。
zpavel
2016-06-21 18:19:59 +08:00
@practicer 卧槽!!太感谢了!原来是这样啊,搞的我一度怀疑自己的智商。
krivol
2016-06-21 18:27:28 +08:00
@xiahei 敲字决。实践实践实践。
krivol
2016-06-21 18:28:23 +08:00
@xiahei 一个字:干!
SuperFashi
2016-06-21 18:35:25 +08:00
下面那道题多简单啊,你看:
return [[1], [1, 1], [1, 2, 1], [1, 3, 3, 1], [1, 4, 6, 4, 1], [1, 5, 10, 10, 5, 1], [1, 6, 15, 20, 15, 6, 1], [1, 7, 21, 35, 35, 21, 7, 1], [1, 8, 28, 56, 70, 56, 28, 8, 1], [1, 9, 36, 84, 126, 126, 84, 36, 9, 1]]
就可以 ac 了~
xucuncicero
2016-06-21 18:53:47 +08:00
我的原则是实用至上,很多算法是在使用中弄明白的。

以前只会 vba 的时候,经常用 excel 处理一些问题,有时候不知道怎么处理,上午搜一下一般会遇到别人已经研究过的模型,再简化 /推广一下就是某个非常著名的算法,把自己的问题解决完了,一般这个算法也掌握的差不多了,可以开始举一反三了。单纯给我个算法让我看我是没那个耐心的。

现在用 python 多一点,但这个处理流程已经成习惯了,感觉挺有效的。我是不太建议死啃算法书的,当然如果是学生就是另一回事了。
Rand01ph
2016-06-21 19:40:58 +08:00
@xiahei 我就看的廖雪峰的教程学的 python ,请问有什么不妥的

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/287322

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX