鱼C论坛

 找回密码
 立即注册
查看: 3412|回复: 8

为何这个递归函数输出的结果是[4],而不是[1,0,4]

[复制链接]
发表于 2016-3-25 20:02:25 | 显示全部楼层 |阅读模式

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

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

x
就是简单地把104每个位的数字在列表中打印出来


def get_digits(n):
    result = []
    if n:
        get_digits(n//10)
        result.append(n%10)
        return(result)


print(get_digits(104))
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2016-3-25 21:00:54 | 显示全部楼层
因为你这个写法每次递归的时候都会清空列表,如果一定要这么写的话,可以这样:
  1. def get_digits(n, result=[]):
  2.     if n:
  3.         result.append(n%10)
  4.         get_digits(n//10, result)
  5.         return(result)

  6. print(get_digits(104))
复制代码

其实只是要这种简单的功能,也许可以这么写:
  1. def get_digits(n):
  2.     return(list(str(n)))

  3. print(get_digits(104))
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-4-13 19:58:21 | 显示全部楼层
holdme 发表于 2016-3-25 21:00
因为你这个写法每次递归的时候都会清空列表,如果一定要这么写的话,可以这样:

其实只是要这种简单的功 ...

谢谢您的回复,但是我还是不能理解。

这是我理解的递归过程

这是我理解的递归过程
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-4-13 20:00:28 | 显示全部楼层
星期日 发表于 2016-4-13 19:58
谢谢您的回复,但是我还是不能理解。

上图是我理解的递归过程,我认为最后会输出 [1,0,4] 啊
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-4-13 20:01:05 | 显示全部楼层
holdme 发表于 2016-3-25 21:00
因为你这个写法每次递归的时候都会清空列表,如果一定要这么写的话,可以这样:

其实只是要这种简单的功 ...

下图是我理解的递归过程,我认为最后会输出 [1,0,4] 啊
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-4-13 20:28:35 | 显示全部楼层
星期日 发表于 2016-4-13 20:01
下图是我理解的递归过程,我认为最后会输出 [1,0,4] 啊
  1. def get_digits(n):
  2.      result = []
  3.      if n:
  4.          get_digits(n//10)
  5.          result.append(n%10)
  6.          
  7.      print(result)
  8.      return (result)


  9. print(get_digits(104))
复制代码

运行这个代码可以看到结果是:
[]
[1]
[0]
[4]
[4]
你写的递归每次是返回了你需要的数字的,可是你没有把他们储存在一起,那最后打印的就是最外面一层的返回值了,2楼通过多传一个参数,就可以把他们储存在一起,一起打印出来。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-4-13 22:26:44 | 显示全部楼层
小火木 发表于 2016-4-13 20:28
运行这个代码可以看到结果是:
[]
[1]

谢谢您的回复,我还是不理解啊。2楼的代码打印的是最后一次的return的值吗?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-4-13 23:06:54 | 显示全部楼层
星期日 发表于 2016-4-13 22:26
谢谢您的回复,我还是不理解啊。2楼的代码打印的是最后一次的return的值吗?

2楼打印的是最后一次的return值,result这个列表每次递归都使用了,存下了递归得到的所有值。打印的最后一次return值就是包含了每层递归所得的值的result。

你的代码打印的也是最后一次的return值,你的代码每层都有一个result存下了本层所得的值,每一层的result是相互隔离的,不是同一个变量,打印的时候就打印了最外层的return值。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-4-14 21:22:52 | 显示全部楼层
小火木 发表于 2016-4-13 23:06
2楼打印的是最后一次的return值,result这个列表每次递归都使用了,存下了递归得到的所有值。打印的最后 ...

哦,我终于理解了,太感谢了
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-2-20 08:56

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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