python 新手有点关于算法的困惑,比如在学习生成器的时候看到斐波拉契数列的函数真的很困惑啊,然后又有个杨辉三角的题目彻底懵逼了。。。。 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
zpavel
V2EX    Python

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

  •  
  •   zpavel 2016-06-21 15:50:00 +08:00 5696 次点击
    这是一个创建于 3414 天前的主题,其中的信息可能已经有所发展或是发生改变。
    http://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000/0014317799226173f45ce40636141b6abc8424e12b5fb27000#0
    奉上链接,顺便问下,对这种算法真的是摸不着头脑怎么办?读读算法类的书?
    30 条回复    2016-06-22 21:54:42 +08:00
    zpavel
        1
    zpavel  
    OP
       2016-06-21 15:50:46 +08:00
    求各位长者给点人生经验嘛
    alphadog619
        2
    alphadog619  
       2016-06-21 15:51:54 +08:00
    懵逼正常!一个知识点多看几遍,我也是初学 python
    Xs0ul
        3
    Xs0ul  
       2016-06-21 15:55:46 +08:00 via Android
    波那契和杨辉三角只是单纯的定义吧?
    xiahei
        4
    xiahei  
       2016-06-21 15:57:41 +08:00
    找书看,
    拒绝廖雪疯,
    别光看,
    多练,多练,多练
    多写代码,多写代码,多写代码。
    学会跳, n 遍之后还不会,跳过吧,下次再来。
    vinceguo
        5
    vinceguo  
       2016-06-21 16:05:52 +08:00 via Android   1
    斐波那契和杨辉三角都搞不清么?初中生?小学生?好可怕
    Chrisplus
        6
    Chrisplus  
       2016-06-21 16:08:09 +08:00   1
    先玩玩汉诺塔?
    体会一下? http://www.7k7k.com/swf/335.htm
    eamon666
        7
    eamon666  
       2016-06-21 16:09:41 +08:00
    吓尿
    clino
        8
    clino  
       2016-06-21 16:09:50 +08:00 via Android
    你是让大家猜猜看你的疑惑到底在哪里是吗?
    zpavel
        9
    zpavel  
    OP
       2016-06-21 16:10:33 +08:00
    @xiahei 拒绝廖雪峰?这是啥梗?
    zpavel
        10
    zpavel  
    OP
       2016-06-21 16:14:25 +08:00
    @clino 额,好像是没说清楚。我的意思是,斐波拉契数列和杨辉三角规律我知道,但是表达式看的我有点晕。比如 a, b = b, a + b ,把 b 赋给 a ,再把 a+b 赋给 b (这是 b 以 a 值累加对吧?),然而合在一起就有点懵了。
    zpavel
        11
    zpavel  
    OP
       2016-06-21 16:17:19 +08:00
    @Chrisplus 太感谢了,昨天确实碰到这个了。刚玩了一下,会玩,但是如果让我写出来的话,就难了。。。我想是不是我在思路这一块出了点问题。
    sxmman
        12
    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
        13
    xiahei  
       2016-06-21 16:44:13 +08:00
    @zpavel
    各有所爱。
    practicer
        14
    practicer  
       2016-06-21 16:51:38 +08:00   1
    我也是新手,要理解这几个例子前先要理解递归思想,它的根本思想是递归。而你贴的教程是为了让你理解生成器,生成器已经属于 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
        15
    zpavel  
    OP
       2016-06-21 18:19:59 +08:00
    @practicer 卧槽!!太感谢了!原来是这样啊,搞的我一度怀疑自己的智商。
    krivol
        16
    krivol  
       2016-6-21 18:27:28 +08:00 via Android
    @xiahei 敲字决。实践实践实践。
    krivol
        17
    krivol  
       2016-06-21 18:28:23 +08:00 via Android
    @xiahei 一个字:干!
    SuperFashi
        18
    SuperFashi  
       2016-06-21 18:35:25 +08:00 via Android
    下面那道题多简单啊,你看:
    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
        19
    xucuncicero  
       2016-06-21 18:53:47 +08:00
    我的原则是实用至上,很多算法是在使用中弄明白的。

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

    现在用 python 多一点,但这个处理流程已经成习惯了,感觉挺有效的。我是不太建议死啃算法书的,当然如果是学生就是另一回事了。
    Rand01ph
        20
    Rand01ph  
       2016-06-21 19:40:58 +08:00 via iPhone
    @xiahei 我就看的廖雪峰的教程学的 python ,请问有什么不妥的
    theFool
        21
    theFool  
       2016-06-21 20:42:47 +08:00
    @practicer 斐的递归就不要再写这种了。
    nan0kai
        22
    nan0kai  
       2016-06-21 20:48:48 +08:00
    @Chrisplus Game #1: 12 moves.
    Game #2: 7 moves.
    Game #3: 9 moves.
    Game #4: 7 moves.
    Game #5: 31 moves.
    Game #6: 21 moves.
    Game #7: 56 moves.
    Game #8: 273 moves.


    真心累....
    xiahei
        23
    xiahei  
       2016-06-21 23:15:51 +08:00
    @Rand01ph 没有任何不妥的,个人所爱(yan).
    lozzow
        24
    lozzow  
       2016-06-21 23:44:48 +08:00 via Android
    @xiahei 你说各有所爱, 之前又让人拒绝廖雪峰
    incesa
        25
    incesa  
       2016-06-22 05:58:00 +08:00 via iPhone
    @lozzow 我感觉廖雪峰的教程适合有基础的人看,当入门教程有点太难了
    n5530
        26
    n5530  
       2016-06-22 10:55:35 +08:00
    @incesa 这个还难?求推荐更适合入门的,之前看了一段时间廖雪峰的,后边没看下去。
    incesa
        27
    incesa  
       2016-06-22 11:39:10 +08:00
    @n5530 廖学峰的教程有点像教材上划的重点,没有任何基础的话我觉得还是挺难看懂的
    incesa
        28
    incesa  
       2016-06-22 11:43:36 +08:00
    @incesa 补充:我刚开始看的时候看的 python 核心编程,刚开始也觉得很看着很无聊,但是看几章以后觉得还可以。看完这本了在看廖学峰的教程感觉效果更好
    kimgo110
        29
    kimgo110  
       2016-06-22 21:50:57 +08:00
    让我不禁想到当年竞赛用 Pascal 写上边所讲的东西,虽然早已不接触编程了。
    peneazy
        30
    peneazy  
       2016-06-22 21:54:42 +08:00 via Android
    初学都这样。最近两周学习设计模式,同时又研究部门老大写的业务代码,编程感觉提升了很多。多思考,多练习。
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     2828 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 25ms UTC 13:52 PVG 21:52 LAX 06:52 JFK 09:52
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86