鱼C论坛

 找回密码
 立即注册
查看: 1454|回复: 14

看完函数章节已经彻底懵逼了,第023、024讲:递归:这帮小兔崽子、汉诺塔

[复制链接]
发表于 2020-1-31 16:02:14 | 显示全部楼层 |阅读模式

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

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

x
1. 写一个函数get_digits(n),将参数n分解出每个位的数字并按顺序存放到列表中。举例:get_digits(12345) ==> [1, 2, 3, 4, 5]



def num(x):
    result = []
    if x:
        num(x//10)
        return result.append(x%10)

   
x = int(input('plz input:'))
print(num(x))


plz input:12345
None


为啥出不来
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-1-31 16:17:51 | 显示全部楼层
result.append() 没有返回值,不能这么写。应该这样:
result = []


def num(x):
    if x:
        result.append(x % 10)
        return num(x // 10)
    else:
        # 将 result 翻转
        result.reverse()
        return result


x = int(input('plz input:'))
print(num(x))
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-2-1 12:10:33 | 显示全部楼层
zltzlt 发表于 2020-1-31 16:17
result.append() 没有返回值,不能这么写。应该这样:


Hi 版主

我又自己改了一下,发现如果这条result = []在函数里面,最后返回出来的只有1位数字,但是如果把result = []拿到外面,就能实现出题目里的要求,想了半天也没明白

def num(x):
result = []
    if x:
        num(x//10)
        result.append(x%10)
        return result
    else:
        return result

   
x = int(input('plz input:'))
print(num(x))

plz input:10
[0]



===========================


result = []
def num(x):

    if x:
        num(x//10)
        result.append(x%10)
        return result
    else:
        return result

   
x = int(input('plz input:'))
print(num(x))

plz input:10
[1, 0]
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-2-1 12:40:54 | 显示全部楼层
水月秋寒 发表于 2020-2-1 12:10
Hi 版主

我又自己改了一下,发现如果这条result = []在函数里面,最后返回出来的只有1位数字,但是 ...

只有版主才能回答吗?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-2-1 12:50:18 | 显示全部楼层
水月秋寒 发表于 2020-2-1 12:10
Hi 版主

我又自己改了一下,发现如果这条result = []在函数里面,最后返回出来的只有1位数字,但是 ...

由于这是递归函数,所以如果把 result = [] 放在函数里面,每次递归都要执行 result = [],导致 result 被清空,当然只有最后添加的数据 0 了。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2020-2-1 13:00:25 | 显示全部楼层
zltzlt 发表于 2020-2-1 12:50
由于这是递归函数,所以如果把 result = [] 放在函数里面,每次递归都要执行 result = [],导致 result  ...

我晕了,写在函数外面的也可以被函数用?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-2-1 13:01:03 | 显示全部楼层
XiaoPaiShen 发表于 2020-2-1 12:40
只有版主才能回答吗?

不是鸭 ,只有版主回复我了。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-2-1 13:02:01 | 显示全部楼层
水月秋寒 发表于 2020-2-1 13:00
我晕了,写在函数外面的也可以被函数用?

可以啊,只要不用赋值操作符 = 为它重新赋值就可以用(可以访问它的方法)。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-2-1 13:37:27 | 显示全部楼层
本帖最后由 XiaoPaiShen 于 2020-2-1 13:48 编辑
水月秋寒 发表于 2020-2-1 13:01
不是鸭 ,只有版主回复我了。。


递归分为 递去 和 归来:

下面的程序在递去时只是压栈,在栈中的参数依次为 12345, 1234, 123, 12, 1, 0
在归来时, result 的值分别为:

[], [1], [1,2] ... [1,2,3,4,5]
最后的返回值就是 [1,2,3,4,5]
def get_digits(n):
    if n > 0:
        result = get_digits(n // 10)
        result.append(n % 10)
    else:
        result = []
    return result

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

使用道具 举报

发表于 2020-7-9 13:38:29 | 显示全部楼层
本帖最后由 jiong_jiong 于 2020-7-9 16:15 编辑
水月秋寒 发表于 2020-2-1 12:10
Hi 版主

我又自己改了一下,发现如果这条result = []在函数里面,最后返回出来的只有1位数字,但是 ...


我跟你的问题一模一样。翻了很多帖子改好了回答你。

你写的result[],可以作为全局变量而无需单独申明,所以不管在函数的内外都可以访问。
但是你写在函数内,每次递归后,都会执行一次result[]=[],就会被清空。解释点这里。

改成这样就对了:
list1=[]
def get_digits(n):
##    list1 =[],我之前写在这里的,也是不行的
    if n:
        list1.append(n%10)        
        return get_digits(n//10)        
    else:
        list1.reverse()
        return print(list1)


另外不要试图写print(list1.reverse()),这个句子输出不了列表。

如果有解答到你的疑问,请给最佳。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-7-9 14:34:21 | 显示全部楼层
jiong_jiong 发表于 2020-7-9 13:38
我跟你的问题一模一样。翻了很多帖子改好了回答你。

你写的result[],他不是一个变量(因此没有局部 ...
你写的result[],他不是一个变量
那它是啥?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-7-9 15:26:13 | 显示全部楼层

他不是一个变量,而是一个全局变量
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-7-9 15:30:43 | 显示全部楼层
Stubborn 发表于 2020-7-9 15:26
他不是一个变量,而是一个全局变量

这不就是亲妈不是妈的逻辑吗……
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-7-9 15:34:49 | 显示全部楼层
永恒的蓝色梦想 发表于 2020-7-9 15:30
这不就是亲妈不是妈的逻辑吗……

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

使用道具 举报

发表于 2020-7-9 16:10:58 | 显示全部楼层
永恒的蓝色梦想 发表于 2020-7-9 15:30
这不就是亲妈不是妈的逻辑吗……

所以,我还是理解错了吗?
列表是全局变量?

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-1-20 01:59

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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