鱼C论坛

 找回密码
 立即注册
查看: 1675|回复: 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


为啥出不来
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

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

  1. result = []


  2. def num(x):
  3.     if x:
  4.         result.append(x % 10)
  5.         return num(x // 10)
  6.     else:
  7.         # 将 result 翻转
  8.         result.reverse()
  9.         return result


  10. x = int(input('plz input:'))
  11. print(num(x))
复制代码
小甲鱼最新课程 -> https://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]
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

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

只有版主才能回答吗?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

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

由于这是递归函数,所以如果把 result = [] 放在函数里面,每次递归都要执行 result = [],导致 result 被清空,当然只有最后添加的数据 0 了。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

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

我晕了,写在函数外面的也可以被函数用?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

不是鸭 ,只有版主回复我了。。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

可以啊,只要不用赋值操作符 = 为它重新赋值就可以用(可以访问它的方法)。
小甲鱼最新课程 -> https://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]
  1. def get_digits(n):
  2.     if n > 0:
  3.         result = get_digits(n // 10)
  4.         result.append(n % 10)
  5.     else:
  6.         result = []
  7.     return result

  8. print(get_digits(12345))
复制代码
小甲鱼最新课程 -> https://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[]=[],就会被清空。解释点这里。

改成这样就对了:
  1. list1=[]
  2. def get_digits(n):
  3. ##    list1 =[],我之前写在这里的,也是不行的
  4.     if n:
  5.         list1.append(n%10)        
  6.         return get_digits(n//10)        
  7.     else:
  8.         list1.reverse()
  9.         return print(list1)
复制代码



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

如果有解答到你的疑问,请给最佳。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

你写的result[],他不是一个变量(因此没有局部 ...
你写的result[],他不是一个变量
那它是啥?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

他不是一个变量,而是一个全局变量
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

这不就是亲妈不是妈的逻辑吗……
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

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

谢谢指教。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-6-23 08:05

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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