找回密码
 立即注册

扫一扫,访问微社区

QQ登录

只需一步,快速开始

查看: 9539|回复: 11

[已回复] 请问我对递归生成器的理解错在哪里了?

3

主题

12

帖子

12

积分

贫民

积分
12
izhy3938 发表于 2017-3-6 22:22:24 | 显示全部楼层 |阅读模式
5威望
先看代码:
  1. def flatten(nested):
  2.         try:
  3.                 for sublist in nested:
  4.                         for element in flatten(sublist):
  5.                                 yield element
  6.         except TypeError:
  7.                 yield nested
  8.                
  9. f = flatten([[[1], 2], 3])
  10. print f.next()  #输出1
复制代码
展开一个分支谈谈我的理解
  1.       flatten([[[1], 2], 3]):
  2.         try:
  3.       [[1], 2] in [[[1], 2], 3]:
  4.       [1] in flatten([[1], 2]):
  5.                                 yield [1]  #第一次执行f.next()获得的返回值
  6.         except TypeError:
  7.                 yield nested
复制代码
  1.       flatten([[1], 2]):
  2.         try:
  3.       [1] in [[1], 2]:
  4.       1 in flatten([1]):
  5.                                 yield 1 #第二次运行f.next()的值
  6.         except TypeError:
  7.                 yield nested
复制代码
  1.      flatten([1]):
  2.         try:
  3.      1 in [1]:
  4.      1 in flatten(1):
  5.                                 yield 1 #第三次运行f.next()的返回值
  6.         except TypeError:
  7.                 yield nested
  8.                
复制代码
按照我的理解三次运行f.next()的返回值返回值分别为[1], 1, 1,很显然我对递归的流程理解是错误的那请问正确的递归流程是什么呢?麻烦给出一个明确的递归流程脑图可以么?附上一半声望值,感谢




回复

使用道具 举报

0

主题

27

帖子

27

积分

贫民

积分
27
maximal_ideal 发表于 2017-3-8 23:31:36 | 显示全部楼层
最外层的flatten(nested) 什么时候会返回值呢 当解析到        

except TypeError:
                yield nested
才返回啊!
回复

使用道具 举报

3

主题

12

帖子

12

积分

贫民

积分
12
izhy3938  楼主| 发表于 2017-3-10 10:16:19 | 显示全部楼层
maximal_ideal 发表于 2017-3-8 23:31
最外层的flatten(nested) 什么时候会返回值呢 当解析到        

except TypeError:

对呀按照我的理解执行的 flatten(1)的时候才返出发TypeError错误,也就是执行到第四层的时候啊。我的理解跟实际执行不一样,不知道问题出在什么地方了
回复

使用道具 举报

4

主题

24

帖子

24

积分

贫民

积分
24
pythonCXZ 发表于 2017-3-17 10:06:04 | 显示全部楼层
其实好像所有的数据都没有进真正的循环:
你看:
def flatten(nested):
        try:
                for sublist in nested:
                        for element in flatten(sublist):
                                yield element
        except TypeError:
                print "Oh my god , ERROR"
                yield  nested

            
f = flatten([[[1], 2], 3])
print f.next()
print f.next()
print f.next()

输出结果是:
Oh my god , ERROR
1
Oh my god , ERROR
2
Oh my god , ERROR
3
回复

使用道具 举报

4

主题

24

帖子

24

积分

贫民

积分
24
pythonCXZ 发表于 2017-3-17 10:07:13 | 显示全部楼层
递归肯定是从flatten(1)开始的
回复

使用道具 举报

2

主题

18

帖子

18

积分

贫民

积分
18
random7 发表于 2017-3-20 20:59:59 | 显示全部楼层
for [1] in flatten([[1],2])
此时并不会执行yield[1]
要先去执行flatten([[1],2]) 这是一个递归函数,并不是一个list
所以第一个yield一直不执行
当每次nested为一个单独的整数时,会执行except下面的yield nested
所以就输出1,2,3

回复

使用道具 举报

3

主题

12

帖子

12

积分

贫民

积分
12
izhy3938  楼主| 发表于 2017-3-24 00:53:05 | 显示全部楼层
random7 发表于 2017-3-20 20:59
for [1] in flatten([[1],2])
此时并不会执行yield[1]
要先去执行flatten([[1],2]) 这是一个递归函数,并 ...

感谢回答,最近忙刚看到,我再好好理解一下谢谢
回复

使用道具 举报

3

主题

12

帖子

12

积分

贫民

积分
12
izhy3938  楼主| 发表于 2017-3-24 00:54:26 | 显示全部楼层
pythonCXZ 发表于 2017-3-17 10:06
其实好像所有的数据都没有进真正的循环:
你看:
def flatten(nested):

感谢回答,最近忙刚看到,我再理解一下。谢谢
回复

使用道具 举报

3

主题

12

帖子

12

积分

贫民

积分
12
izhy3938  楼主| 发表于 2017-3-24 00:57:05 | 显示全部楼层
random7 发表于 2017-3-20 20:59
for [1] in flatten([[1],2])
此时并不会执行yield[1]
要先去执行flatten([[1],2]) 这是一个递归函数,并 ...

确实你的解释跟结果相符,第一个yield不执行的话,为什么还要写出来?
回复

使用道具 举报

2

主题

18

帖子

18

积分

贫民

积分
18
random7 发表于 2017-3-24 15:16:35 | 显示全部楼层
并不是每一条程序语句都会执行
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表