鱼C论坛

 找回密码
 立即注册
查看: 1985|回复: 4

[已解决]递归课后作业

[复制链接]
发表于 2021-2-27 15:50:04 | 显示全部楼层 |阅读模式

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

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

x
写一个函数get_digits(n),将参数n分解出每个位的数字并按顺序存放到列表中。举例:get_digits(12345) ==> [1, 2, 3, 4, 5]
代码如下:
  1. list1 = []
  2. def get_digits(n):
  3.     lenth = len(str(n))
  4.     nums = 10**(lenth)
  5.     if n >= 10:
  6.         a = n // nums
  7.         b = n % nums
  8.         list1.append(a)
  9.         return get_digits(b)
  10.     else:
  11.         list1.append(n)
  12.         return list1
复制代码


每次运行结果总是
  1. >>> get_digits(123)
  2. Traceback (most recent call last):
  3.   File "<pyshell#6>", line 1, in <module>
  4.     get_digits(123)
  5.   File "D:\下载\python\学习\函数6.py", line 53, in get_digits
  6.     return get_digits(n)
  7.   File "D:\下载\python\学习\函数6.py", line 53, in get_digits
  8.     return get_digits(n)
  9.   File "D:\下载\python\学习\函数6.py", line 53, in get_digits
  10.     return get_digits(n)
  11.   [Previous line repeated 1020 more times]
  12.   File "D:\下载\python\学习\函数6.py", line 46, in get_digits
  13.     lenth = len(str(n))
  14. RecursionError: maximum recursion depth exceeded while getting the str of an object
复制代码


是返回值有问题吗?但是我也没看出来啊

核心思路就是用地板除法获取每一位的值,再放到列表里

哪位大神帮看看是哪里出了问题
最佳答案
2021-2-27 16:05:11
本帖最后由 qiuyouzhi 于 2021-2-27 16:06 编辑

你那地板除除的也不对鸭..
而且你递归传入的参数也不对,应该传a
  1. list1 = []
  2. def get_digits(n):
  3.     while n:
  4.         b = n % 10
  5.         a = n // 10
  6.         list1.insert(0, b)
  7.         return get_digits(a)
  8.     return list1

  9. print(get_digits(123))
  10. print(list1)
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2021-2-27 16:05:11 | 显示全部楼层    本楼为最佳答案   
本帖最后由 qiuyouzhi 于 2021-2-27 16:06 编辑

你那地板除除的也不对鸭..
而且你递归传入的参数也不对,应该传a
  1. list1 = []
  2. def get_digits(n):
  3.     while n:
  4.         b = n % 10
  5.         a = n // 10
  6.         list1.insert(0, b)
  7.         return get_digits(a)
  8.     return list1

  9. print(get_digits(123))
  10. print(list1)
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2021-2-27 16:28:29 | 显示全部楼层
qiuyouzhi 发表于 2021-2-27 16:05
你那地板除除的也不对鸭..
而且你递归传入的参数也不对,应该传a

大概明白你的意思了,就是从参数的最后一位向前递归,思路很妙啊,哈哈,非常感谢!
但是我想发现我这个也是可以的(只用改一个数)
我是从参数的第一位往后递归,比如我传入1234
1,获取长度,赋值nums=10000(对!就是这里的问题!应该赋值nums = 1000,所以lenth = len(str(n))-1!!)
2,接着用n地板除和他位数相同的最小值,得到的不就是最高位嘛
3,接着递归传入参数是n%nums这就是那一位后的数
接下来就不用说了
总之还是很感谢的啦哈哈
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-2-27 16:33:07 | 显示全部楼层
跟我一起敲代码 发表于 2021-2-27 16:28
大概明白你的意思了,就是从参数的最后一位向前递归,思路很妙啊,哈哈,非常感谢!
但是我想发现我这个 ...

额,为啥nums要是1000呢?
我的思路是这样,只要n不为0,就取出它的最后一位并去掉
(n//10是去掉一位,n % 10是取出最后一位的值)
然后把它放进列表的第一位,然后继续递归。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-2-27 20:11:47 | 显示全部楼层
qiuyouzhi 发表于 2021-2-27 16:33
额,为啥nums要是1000呢?
我的思路是这样,只要n不为0,就取出它的最后一位并去掉
(n//10是去掉一位, ...

对呀,你取的是最后一位,而我取的是第一位呀,1234//1000不就是1么,234//100不就是2么,这个nums位数保持与余数位数一致,不是都一直除1000
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-6-27 06:32

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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