鱼C论坛

 找回密码
 立即注册
12
返回列表 发新帖
楼主: zltzlt

[已解决]Python:每日一题 285

[复制链接]
发表于 2019-12-8 15:26:19 | 显示全部楼层

大佬,能说一下yield from里面产生的思路吗?我有点看不懂
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-12-8 15:42:29 | 显示全部楼层

恭喜通过!

执行用时:1094 ms
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-12-8 20:49:12 | 显示全部楼层
fan1993423 发表于 2019-12-8 15:26
大佬,能说一下yield from里面产生的思路吗?我有点看不懂

这个我也是百度的,简单的说就是可以将一个迭代器或者序列里面的元素挨个取出来,类似for i in iter() 不过yield from 一般在函数里面使用,并且更方便哦
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-12-8 20:55:16 | 显示全部楼层
18463102026 发表于 2019-12-8 20:49
这个我也是百度的,简单的说就是可以将一个迭代器或者序列里面的元素挨个取出来,类似for i in iter() 不 ...

嗯,后面我稍微懂了,但是就是那个for i in chaoshao()那里,按理来说会重新进行一个循环,不知道最后为什么结果还是在一个列表里,另外yiled的字符串都是带有,的字符串吗?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-12-8 20:59:18 | 显示全部楼层
阴阳神万物主 发表于 2019-12-6 19:58
抢,沙发
代码:
不晓得会不会过最大递归深度。

讲一下思路
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-12-8 21:49:47 | 显示全部楼层
fan1993423 发表于 2019-12-8 20:55
嗯,后面我稍微懂了,但是就是那个for i in chaoshao()那里,按理来说会重新进行一个循环,不知道最后为 ...

这里是找到所有满足条件的值呀,没有这个返回一个就停止了。实际上整个函数返回的都是生成器
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-12-8 23:29:27 | 显示全部楼层

思路嘛,我就选递归最表层说吧。
先不管函数自调用的那个部分,从获得的字符串中从前往后寻找切断点,把原字符串分成左右两个部分。
左边的部分是目前得到的子字符串(以下称之为 '子串' ),右边的部分是没有分割过的,是不是回文不清楚、也不重要。
如果左边子串是回文,那么递归得出右边的子串的所有分割方案(右边子串要作为输入经历函数输入字符串的流程)。
然后遍历得到的右边子串的所有方案,把当前的回文串加在所有方案的左边,如果右边子串没有方案,那么就直接把左边子串作为方案加入到所有方案中。

打个比方说:
输入:'aba'
深度
输入
左边
右边
备注
0 'aba' 'a' 'ba' 左边是回文,
右边作为参数
传给自己
1 'ba' 'b' 'a' 同上
2 'a' 'a' '' 同上
3 ''

返回一个空列表
2 'a' 'a' '' 得到[]
将['a']加入到 res 中
然后返回 res
1 'ba' 'b' 'a' 得到[['a']]
将 'b' 插入所有方案的前面
并加入到res,切断点右移
1'ba'
'ba'
''
左边不是回文
遍历结束,返回res
0'aba' 'a' 'ba' 得到[['b', 'a']]
将 'a' 插入所有方案的前面
并加入到res,切断点右移
此时 res 为
[['a', 'b', 'a']]
0'aba'
'ab'
'a' 左边不是回文
切断点右移
0'aba'
'aba'
'' 左边是回文,
右边作为参数
传给自己
1 ''

返回一个空列表
0 'aba' 'aba' '' 得到[]
将['aba']加入到 res 中
然后返回 res
此时 res 为
[['a', 'b', 'a'], ['aba']]

就是如上流程,不懂另说

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-12-9 14:53:13 | 显示全部楼层
阴阳神万物主 发表于 2019-12-8 23:29
思路嘛,我就选递归最表层说吧。
先不管函数自调用的那个部分,从获得的字符串中从前往后寻找切断点,把 ...

嗯,大体思路我看了你的代码当时还是知道的,我当时比较有疑问的就是,你用递归返回的get=solve(s[i:]),这个函数的返回值是res,但是第一次来执行这个递归的时候并没有到达最后的return res,而后面紧跟的if get,它又是如何判断的呢?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-12-9 15:00:32 | 显示全部楼层
fan1993423 发表于 2019-12-9 14:53
嗯,大体思路我看了你的代码当时还是知道的,我当时比较有疑问的就是,你用递归返回的get=solve(s),这 ...

if get 的意思是:get 是不是非空列表,非空为真否则为假
  1. >>> a = []
  2. >>> if a:
  3.         print('为真')

  4.        
  5. >>> a = [1]
  6. >>> if a:
  7.         print('为真')

  8.        
  9. 为真
  10. >>>
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-12-9 15:06:58 | 显示全部楼层
阴阳神万物主 发表于 2019-12-9 15:00
if get 的意思是:get 是不是非空列表,非空为真否则为假

这个我知道,我有点迷糊的是,第一次get的时候,是solve的赋值,但是solve这个函数的返回值是res,也就是列表,但是solve就是递归函数了,走到solve它就又重新从函数第一步开始,只不过此时的参数变成了右边部分。那此时是没有达到最后的res的,此时get真的有值吗?因为后面马上就是对get进行判断了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-12-9 16:13:45 | 显示全部楼层
fan1993423 发表于 2019-12-9 15:06
这个我知道,我有点迷糊的是,第一次get的时候,是solve的赋值,但是solve这个函数的返回值是res,也就是 ...

赋值这个操作一旦完成,那么 get 至少也是 [] 这么一个空表,不会出现说没有值的情况。
在赋值号的右边的表达式没有计算结束的时候,当前的递归深度是在赋值的那个地方暂停着的,直到赋值号右边的表达式计算结束,也就是得到函数返回值了,才会继续。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-12-9 16:27:56 | 显示全部楼层
阴阳神万物主 发表于 2019-12-9 16:13
赋值这个操作一旦完成,那么 get 至少也是 [] 这么一个空表,不会出现说没有值的情况。
在赋值号的右边 ...

可不可以这样理解,就是在递归函数没结束的时候,是不会执行后面的判断语句的,要等递归深度为0得到最后结果才会紧接着执判断语句,但是最先因为没有到res那步,所以是空列表,会执行else语句,等列表不在为空的时候才开始执行if get语句。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-12-9 16:54:12 | 显示全部楼层
fan1993423 发表于 2019-12-9 16:27
可不可以这样理解,就是在递归函数没结束的时候,是不会执行后面的判断语句的,要等递归深度为0得到最后 ...

看样子,你是没理清递归的含义。
所谓递归,不光是函数自己调用自己这么简单。
递归,有“
”有“”,不同的递归深度,相当于是不同的人执行一样的操作。
所谓”,就是把自己处理到该给下一个人去处理的给传递给下一个人让他/她去处理,然后就等那个人把处理好的送回来。
所谓“归”,就是得到了上一个人给的数据,自己按照相同的操作处理,得到正确结果后,把这个结果送给上一个人。
整个过程中,能够互相影响的,只有一递一归,这两个步骤,其他的不管怎么闹,哪怕大闹天宫都没有影响。
打个比方:
老师罚你抄文章100遍,你出200元人民币,叫来两个人,一人给100,各抄五十遍,最后把成品交还给你,然后这两个人又各自叫来几个人分出去多少钱,到最后差不多有一百个人在抄,平均一个人的一块钱抄一遍。
路子跟递归是差不多的。

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-12-10 08:41:35 | 显示全部楼层
阴阳神万物主 发表于 2019-12-9 16:54
看样子,你是没理清递归的含义。
所谓递归,不光是函数自己调用自己这么简单。
递归,有“递”有“归” ...

好吧,我再去理解下
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-4-20 03:33

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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