鱼C论坛

 找回密码
 立即注册
查看: 1163|回复: 2

[已解决]python 零基础 23, 24课, 递归问题

[复制链接]
发表于 2020-1-10 13:48:21 | 显示全部楼层 |阅读模式

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

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

x
麻烦给位大神帮我看下下面两个程序,为什么输出结果过不一样, 可否帮我解释一下运算过程:

result = []
def get_digits(n):
        if n > 0:
                result.insert(0, n%10)
                return get_digits(n//10)

get_digits(12345)
print(result)

输出结果是[1, 2, 3, 4, 5], 顺便问一下在get_digits(n//10)之前的return 加和不加有区别吗?

result = []
def get_digits(n):
        if n > 0:
                get_digits(n//10)
                result.insert(0, n%10)
               
get_digits(12345)
print(result)

输出结果是[5, 4, 3, 2, 1]

谢谢!
最佳答案
2020-1-10 14:56:56
两段程序都用了递归,在这个程序中,有没有return没有什么区别,反正用的都是全局变量result。但是实际上函数有没有return语句差别还是很大的。
下面重点说一下两端程序的运行过程。
先用insert,后递归:(我们假设n=123,层数少一些,道理是一样的)
第一层:n=123, result.insert(0, n%10)之后,result=[3],然后get_digits(n//10),进入第二层,
        第二层:n=12,result.insert(0, n%10)之后,result=[2,3],然后get_digits(n//10),进入第三层,
                第三层,n=1,result.insert(0, n%10)之后,result=[1,2,3],然后get_digits(n//10),进入第四层,
                        第四层,n=0,已经不符合 if n>0的条件,因此不会再执行if模块的语句,即不会再次调用递归函数get_digits(),
                        结束第四层get_digits(),返回第三层;
                结束第三层get_digits(),返回第二层;
        结束第二层get_digits(),返回第一层;
结束第一层get_digits(),返回主函数。
此时,result=[1,2,3].

先调用递归,后用insert:(我们同样假设n=123)
第一层:n=123, get_digits(n//10),进入第二层,
        第二层:n=12,get_digits(n//10),进入第三层,
                第三层,n=1,get_digits(n//10),进入第四层,
                        第四层,n=0,已经不符合 if n>0的条件,因此不会再执行if模块的语句,即不会再次调用递归函数get_digits(),
                        结束第四层get_digits(),返回第三层;
                result.insert(0, n%10)之后,result=[1],结束第三层get_digits(),返回第二层;
        result.insert(0, n%10)之后,result=[2,1],结束第二层get_digits(),返回第一层;
result.insert(0, n%10)之后,result=[3,2,1],结束第一层get_digits(),返回主函数。
此时,result=[3,2,1].

另外,你可以看一下这个帖子,我在这里也有回答。之前的回答
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-1-10 14:56:56 | 显示全部楼层    本楼为最佳答案   
两段程序都用了递归,在这个程序中,有没有return没有什么区别,反正用的都是全局变量result。但是实际上函数有没有return语句差别还是很大的。
下面重点说一下两端程序的运行过程。
先用insert,后递归:(我们假设n=123,层数少一些,道理是一样的)
第一层:n=123, result.insert(0, n%10)之后,result=[3],然后get_digits(n//10),进入第二层,
        第二层:n=12,result.insert(0, n%10)之后,result=[2,3],然后get_digits(n//10),进入第三层,
                第三层,n=1,result.insert(0, n%10)之后,result=[1,2,3],然后get_digits(n//10),进入第四层,
                        第四层,n=0,已经不符合 if n>0的条件,因此不会再执行if模块的语句,即不会再次调用递归函数get_digits(),
                        结束第四层get_digits(),返回第三层;
                结束第三层get_digits(),返回第二层;
        结束第二层get_digits(),返回第一层;
结束第一层get_digits(),返回主函数。
此时,result=[1,2,3].

先调用递归,后用insert:(我们同样假设n=123)
第一层:n=123, get_digits(n//10),进入第二层,
        第二层:n=12,get_digits(n//10),进入第三层,
                第三层,n=1,get_digits(n//10),进入第四层,
                        第四层,n=0,已经不符合 if n>0的条件,因此不会再执行if模块的语句,即不会再次调用递归函数get_digits(),
                        结束第四层get_digits(),返回第三层;
                result.insert(0, n%10)之后,result=[1],结束第三层get_digits(),返回第二层;
        result.insert(0, n%10)之后,result=[2,1],结束第二层get_digits(),返回第一层;
result.insert(0, n%10)之后,result=[3,2,1],结束第一层get_digits(),返回主函数。
此时,result=[3,2,1].

另外,你可以看一下这个帖子,我在这里也有回答。之前的回答
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-1-11 03:03:34 | 显示全部楼层
sunrise085 发表于 2020-1-10 14:56
两段程序都用了递归,在这个程序中,有没有return没有什么区别,反正用的都是全局变量result。但是实际上函 ...

解释的非常清楚。辛苦了。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-6-5 20:29

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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