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 · 5191 次点击
    这是一个创建于 3067 天前的主题,其中的信息可能已经有所发展或是发生改变。
    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-06-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   ·   实用小工具   ·   5687 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 32ms · UTC 03:21 · PVG 11:21 · LAX 19:21 · JFK 22:21
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.