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

2015-09-15 11:57:21 +08:00
 billgreen1
~~~python
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 摊平。关于递归程序,有时候写的是正确的,有时候就不正确。
请教请教
2850 次点击
所在节点    Python
13 条回复
exch4nge
2015-09-15 12:11:50 +08:00
我是没看明白,这段程序怎么能弄平 list ……
函数返回值是个 list ,递归也没用啊
WKPlus
2015-09-15 12:12:20 +08:00
flatten 返回的一个 list ,然后递归的时候又把这个返回值作为 list 的元素,所以。。。
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
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
2015-09-15 12:15:14 +08:00
懒得用 gist 抱歉(摊手…
WKPlus
2015-09-15 12:19:48 +08:00
给你找到一个比较优雅的答案: http://stackoverflow.com/questions/2158395/flatten-an-irregular-list-of-lists-in-python

我是 sof 搬运工:)
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
2015-09-15 14:59:58 +08:00
re   t 就算只有一个数也成了序列
yuxizhou
2015-09-15 15:30:49 +08:00
用 generator 的答案好评
miemiekurisu
2015-09-15 22:47:06 +08:00
....你如果只是要弄平....
真心不如一句 str (ragg ).replace ('[','').replace (']','').split (',')
billgreen1
2015-09-19 09:42:30 +08:00
@exch4nge @WKPlus @aheadlead 真是感谢你们啊, stackoverflow 上的答案我也看了,只是自己那时候不明白为什么自己写得程序不行,现在好像有点明白了。

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

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

不要告诉我:要理解递归,首先你要理解递归。
aheadlead
2015-09-19 10:52:28 +08:00
@billgreen1 唔,很小的时候数学启蒙课老师有讲过…
exch4nge
2015-09-20 19:25:25 +08:00
@billgreen1 像楼上说的一样,我觉得递归跟数学的那个什么数学归纳法差不多,给你一个问题,你能把这个问题分解成更小的子问题,并且问题跟子问题是一样的。编程的时候,你要清楚你这个函数输入输出是什么, 是不是递归调用的时候,是不是写对了输入,再看看子问题输出怎么处理才能得到问题的结果。

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

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

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

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

© 2021 V2EX