鱼C论坛

 找回密码
 立即注册
查看: 2385|回复: 6

递归、列表、return,三个凑到一起我就头大了

[复制链接]
发表于 2017-1-25 21:03:11 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 无聊才上线 于 2017-1-25 21:11 编辑

做第30讲的作业,发现的一个问题。

list2 = []

def search(target,key,flag = 0):
    flag = target.find(key,flag)
    if flag != -1:
        list2.append(flag+1)
        search(target,key,flag+1)
    else:
        return list2

a = search('开始的开始我们都是孩子,最后的最后……','开始')
print(a)
(这是写法1)
以上代码照我的理解,第一次flag=0,list2.append(0),然后递归flag=1,list2.append(4),接着递归flag=4,执行else的return list2
这样运行print就可以打印出list2了,但是结果函数没有给返回值???

----------------------------------------下面是改进----------------------------------
为了能有返回值,在递归前加上return就神奇的好了!!!(这是写法2)
那么问题来了,我不写return不也在list2里append进flag了吗?我只要执行函数把值append进list2就可以了啊?为什么递归函数还要return呢???
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2017-1-25 22:04:10 | 显示全部楼层
就像for循环需要print语句一样的,理解吗
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2017-1-26 18:05:53 | 显示全部楼层
本帖最后由 无聊才上线 于 2017-1-26 18:15 编辑

已经想明白了,和下面是一样的道理
def get_digits(n):
    result = []
    if n > 0:
        result.append(n%10)
        return (result + get_digits(n//10))
    else:
        return result

   
print(get_digits(1234))

if判断里如果不写返回值,就会出现result和一个NoneType相加的情况。


而方法1在递归到最后一次的时候返回一个空列表,但之后的循环就没有任何返回值了,所以是个NoneType。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2017-1-26 18:11:59 | 显示全部楼层
已经解决,很弱智的问题
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2017-2-27 21:34:44 | 显示全部楼层
学习学习
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2017-2-28 08:37:40 | 显示全部楼层
按照我的理解,你把return语句放在else里面,是不是可以这样理解:只有当flag=-1时,函数才返回list2
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2017-2-28 18:02:48 | 显示全部楼层
五行缺五行 发表于 2017-2-28 08:37
按照我的理解,你把return语句放在else里面,是不是可以这样理解:只有当flag=-1时,函数才返回list2

分析内存,返回值是放在栈空间的,我原来的方法没有返回值,把控制赋给a,a当然是空的
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-2-25 03:48

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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