鱼C论坛

 找回密码
 立即注册
查看: 2294|回复: 5

求助关于递归的问题

[复制链接]
发表于 2017-1-8 10:07:40 | 显示全部楼层 |阅读模式
10鱼币
小甲鱼第23讲的作业,简单说就是将输入的转换成列表,比如get_digits(1243)输出结果是[1,2,4,3]。
----------------------以下是我的程序-------------------
def get_digits(n):
    result = []
   
    if n//10 > 0:                                #判断是n是否只剩下各位数
        result.append(n%10)            #将n的最后一位插入列表
        get_digits(n//10)                  #去掉n的最后一位,再次递归
    else:
        result.append(n)                  #如果n只有个位,讲n插入到列表中
        return result


为嘛执行后返回的结果为空呢?
再小改一下,把return放到else分支外边,输出结果就只有最后一位3

感觉if判断里边的result.append(n%10)没有被执行过一样,只是当n//10为0的时候才执行了append。
求助各位前辈,帮我看看问题出在哪里,回答越详细越好。

PS:我知道程序执行后结果是反向的,我们暂时抛开那个不说,先求助为什么没有把4个数字都插入到列表里。

最佳答案

查看完整内容

你的这个函数写法有问题: 1)把结果列表result定义在函数体内,这样的话,在你每次调用递归函数时,它就会被清空,所以最后的结果只会保留一个值,所以并非你所说的if语句里面的result.append(n%10)没有被执行过; 2)最后,你的整个函数,没有返回; 这分两种写法: a)如果你是把return result语句,写在else下面,则整个递归函数,会返回None类型。 造成这个情况的原因是,整个递归函数,你只在最后一个个位数的时候, ...
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2017-1-8 10:07:41 | 显示全部楼层
你的这个函数写法有问题:
1)把结果列表result定义在函数体内,这样的话,在你每次调用递归函数时,它就会被清空,所以最后的结果只会保留一个值,所以并非你所说的if语句里面的result.append(n%10)没有被执行过;
2)最后,你的整个函数,没有返回;
这分两种写法:
    a)如果你是把return result语句,写在else下面,则整个递归函数,会返回None类型。
造成这个情况的原因是,整个递归函数,你只在最后一个个位数的时候,显示指定了return,而函数如果不指定return的话,它只会返回None。而你在最外层的函数中,并没有return,所以最后的返回结果会是None
    b)如果把return result写在if外面,那就是说,你的最外层函数有返回值了,所以就返回了最后一位3,因为你的列表,也只有一个元素

要实现这个功能,我这里写出两种方法,仅供交流。
  1. # 方法1: 直接使用类型转换,一句代码完成
  2. num = raw_input('请输入一个数字: ' )
  3. print '转化为列表形式为:\n%s' % list(num)


  4. # 方法2: 定义一个递归函数,传递两个参数, 一个是列表,一个是整数
  5. def get_digit2(res, n):
  6.     if n // 10:
  7.         res.insert(0, n % 10)
  8.         get_digit2(res, n // 10)
  9.     else:
  10.         res.insert(0, n)

  11.     return res

  12. num = raw_input('请输入一个数字: ' )
  13. result = []
  14. get_digit2(result, int(num))
  15. print result
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2017-1-8 11:18:30 From FishC Mobile | 显示全部楼层
本帖最后由 jerryxjr1220 于 2017-1-8 11:21 编辑

因为你每次调用递归的时候,都把列表清空了,要保留结果,必须把列表的初始化放到函数外面

评分

参与人数 1荣誉 +5 鱼币 +5 贡献 +3 收起 理由
无聊才上线 + 5 + 5 + 3 感谢

查看全部评分

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

使用道具 举报

 楼主| 发表于 2017-1-8 13:57:02 | 显示全部楼层
琅玡 发表于 2017-1-8 10:07
你的这个函数写法有问题:
1)把结果列表result定义在函数体内,这样的话,在你每次调用递归函数时,它就 ...

再请教一下
def Dec2Bin(dec):
    result = ''
   
    if dec:
        result = Dec2Bin(dec//2)
        return result + str(dec%2)
    else:
        return result

print(Dec2Bin(62))
这个代码,为什么循环的时候不会把result清空呢?也是定义在函数内部的呀
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2017-1-8 14:09:43 | 显示全部楼层
无聊才上线 发表于 2017-1-8 13:57
再请教一下
def Dec2Bin(dec):
    result = ''

只要在函数内部每次调用都清空的,它和你的程序不一样的是,它在返回的时候是把前一次的结果与这次的结果合在一起返回的“return result + str(dec%2)”,而不像你的程序,只返回当前一次递归的结果。
如果它的程序写成“return result”,那么和你的程序就是一样的了,都不保留以前递归的结果。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2017-1-9 18:01:28 | 显示全部楼层
.......................................
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-9-28 03:43

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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