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
billgreen1
V2EX  ›  Python

请教这段递归代码错在何处?

  •  
  •   billgreen1 · 2015-09-15 11:57:21 +08:00 · 2997 次点击
    这是一个创建于 3350 天前的主题,其中的信息可能已经有所发展或是发生改变。
    from collections import Sequence
    
    
    def flatten (ragged_lst ):
        ret = [flatten (item ) if isinstance (item, Sequence ) else item for item in ragged_lst]
        return ret
    
    
    def main ():
        ragg = [1, [2, 3], 4, [5, [6, 7, [8, 9], 10], 11], 12]
        print (flatten (ragg ))
    
    if __name__ == '__main__':
        main ()
    

    本意是把一个不规则的 list 摊平。关于递归程序,有时候写的是正确的,有时候就不正确。
    请教请教

    13 条回复    2015-09-20 19:25:25 +08:00
    exch4nge
        1
    exch4nge  
       2015-09-15 12:11:50 +08:00
    我是没看明白,这段程序怎么能弄平 list ……
    函数返回值是个 list ,递归也没用啊
    WKPlus
        2
    WKPlus  
       2015-09-15 12:12:20 +08:00
    flatten 返回的一个 list ,然后递归的时候又把这个返回值作为 list 的元素,所以。。。
    aheadlead
        3
    aheadlead  
       2015-09-15 12:13:57 +08:00
    def flatten (ragged_lst ):
    ret = []
    for item in ragged_lst:
    ret = ret + flatten (item ) if isinstance (item, list ) else ret + [item]
    return ret
    aheadlead
        4
    aheadlead  
       2015-09-15 12:14:28 +08:00
    def flatten (ragged_lst ):
    ret = []
    for item in ragged_lst:
    ret = ret + flatten (item ) if isinstance (item, list ) else ret + [item]
    return ret
    aheadlead
        5
    aheadlead  
       2015-09-15 12:15:14 +08:00
    懒得用 gist 抱歉(摊手…
    WKPlus
        6
    WKPlus  
       2015-09-15 12:19:48 +08:00
    给你找到一个比较优雅的答案: http://stackoverflow.com/questions/2158395/flatten-an-irregular-list-of-lists-in-python

    我是 sof 搬运工:)
    9hills
        7
    9hills  
       2015-09-15 12:19:58 +08:00
    1L 正解:
    ret = [flatten (item ) if isinstance (item, Sequence ) else item for item in ragged_lst]
    这块写错了
    leavic
        8
    leavic  
       2015-09-15 14:59:58 +08:00 via iPhone
    re   t 就算只有一个数也成了序列
    yuxizhou
        9
    yuxizhou  
       2015-09-15 15:30:49 +08:00
    用 generator 的答案好评
    miemiekurisu
        10
    miemiekurisu  
       2015-09-15 22:47:06 +08:00
    ....你如果只是要弄平....
    真心不如一句 str (ragg ).replace ('[','').replace (']','').split (',')
    billgreen1
        11
    billgreen1  
    OP
       2015-09-19 09:42:30 +08:00
    @exch4nge @WKPlus @aheadlead 真是感谢你们啊, stackoverflow 上的答案我也看了,只是自己那时候不明白为什么自己写得程序不行,现在好像有点明白了。

    关于递归,我总是有点似懂非懂的感觉,有些程序能写得出来,有些就不能。
    比如对于树的数据结构,大量用到递归,其中一些算法我能看明白,自己也能实现。但是对于另一些算法,当时好像看明白了,自己实现就是错的。

    你们都是怎么学习递归的?谢谢。

    不要告诉我:要理解递归,首先你要理解递归。
    aheadlead
        12
    aheadlead  
       2015-09-19 10:52:28 +08:00
    @billgreen1 唔,很小的时候数学启蒙课老师有讲过…
    exch4nge
        13
    exch4nge  
       2015-09-20 19:25:25 +08:00
    @billgreen1 像楼上说的一样,我觉得递归跟数学的那个什么数学归纳法差不多,给你一个问题,你能把这个问题分解成更小的子问题,并且问题跟子问题是一样的。编程的时候,你要清楚你这个函数输入输出是什么, 是不是递归调用的时候,是不是写对了输入,再看看子问题输出怎么处理才能得到问题的结果。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2827 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 28ms · UTC 04:05 · PVG 12:05 · LAX 20:05 · JFK 23:05
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.