鱼C论坛

 找回密码
 立即注册
查看: 1387|回复: 19

[已解决]递归函数没有返回值?

[复制链接]
发表于 2020-6-12 23:56:54 | 显示全部楼层 |阅读模式

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

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

x
为啥这函数执行了啥都没有?

函数外定义一个列表再函数内声明全局变量,再调用列表又有了。
最佳答案
2020-6-13 00:52:19
本帖最后由 Twilight6 于 2020-6-13 00:55 编辑
lsc00844 发表于 2020-6-13 00:12
这个执行了还是没有返回额,temp.append(quo)这执行的时候,是往下走的时候,还是返回的时候。


先把这个循环去掉,如果用循环还不如直接不用递归哈
  1. while temp:
  2.                 result=result+str(temp.pop())
复制代码

还有  函数返回值在 IDLE交互界面会自动打印,而如果是在编译器编辑然后运行是不会自己打印 return 的结果的 要 加上 print(Dec2Bin(10)) 这样

列表的 大部分方法都是在原列表上进行变化 ,没有返回值 所以返回了 None

比如 append、reverse、remove、insert、extend、sort等都是没有返回值的,但是 pop 有返回值,将列表元素取出并返回

所以这边不能返回 temp.append(1),不然返回的是 None

而且 你的 if 条件有些差错,递归设置一个出口,当递归到0的时候就退出递归 返回列表

最后帮你代码改了一下:
  1. def Dec2Bin(dec):
  2.     temp = []
  3.     if dec == 0:
  4.         return temp
  5.     else:
  6.         quo = dec % 2
  7.         temp.append(quo)
  8.         return Dec2Bin(dec // 2)+temp

  9. print(Dec2Bin(10))
复制代码

因为你返回的是列表 所以打印的结果也是列表,所以递归结束时候你可以这样打印:
  1. def Dec2Bin(dec):
  2.     temp = []
  3.     if dec == 0:
  4.         return temp
  5.     else:
  6.         quo = dec % 2
  7.         temp.append(quo)
  8.         return Dec2Bin(dec // 2)+temp
  9.    
  10. print('0b',end='')
  11. for i in Dec2Bin(10):
  12.     print(i,end='')
复制代码

输出结果是:
  1. >>> 0b1010
复制代码

0b 开头代表着数字是二进制数字

弄成字符串更好,直接拼接就可以:
  1. def Dec2Bin(dec):
  2.     temp = ''
  3.     if dec == 0:
  4.         return temp
  5.     else:
  6.         temp += str(dec%2)
  7.         return Dec2Bin(dec // 2)+temp

  8. print('0b'+Dec2Bin(10))
复制代码

微信图片_20200612235503.jpg
微信图片_20200612235511.jpg
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2020-6-12 23:58:51 | 显示全部楼层
本帖最后由 Twilight6 于 2020-6-13 00:00 编辑

....啊,外星人,羡慕!

建议下个截屏软件 ,这样拍照不觉得麻烦嘛,还要传电脑

snipaste 这个截屏软件好用  F1 截屏
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-6-13 00:01:06 | 显示全部楼层
Twilight6 发表于 2020-6-12 23:58
....啊,外星人,羡慕!

建议下个截屏软件 ,这样拍照不觉得麻烦嘛,还要传电脑

前面拍的照,在群里问了下没人回复。。就发这来了,后面还是截图好。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-6-13 00:02:11 | 显示全部楼层
本帖最后由 Twilight6 于 2020-6-13 00:03 编辑
lsc00844 发表于 2020-6-13 00:01
前面拍的照,在群里问了下没人回复。。就发这来了,后面还是截图好。



列表的 大部分方法都是在原列表上进行变化 ,没有返回值 所以返回了 None

比如 append、reverse、remove、insert、extend、sort等都是没有返回值的,但是 pop 有返回值,将列表元素取出并返回
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-6-13 00:12:36 | 显示全部楼层
Twilight6 发表于 2020-6-13 00:02
列表的 大部分方法都是在原列表上进行变化 ,没有返回值 所以返回了 None

比如 append、reverse、 ...
  1. >>> def Dec2Bin(dec):
  2.         temp=[]
  3.         if dec//2==0:
  4.                 return temp.append(1)
  5.         else:
  6.                 quo=dec%2
  7.                 temp.append(quo)
  8.                 return Dec2Bin(dec//2)
  9.         return temp

  10. >>> Dec2Bin(9)
  11. >>> def Dec2Bin(dec):
  12.         temp=[]
  13.         if dec//2==0:
  14.                 return temp.append(1)
  15.         else:
  16.                 quo=dec%2
  17.                 temp.append(quo)
  18.                 return Dec2Bin(dec//2)
  19.         print(temp)

  20.        
  21. >>> Dec2Bin(9)
  22. >>> temp=[]
  23. >>> def Dec2Bin2(dec):
  24.         global temp
  25.         if dec//2==0:
  26.                 return temp.append(1)
  27.         else:
  28.                 quo=dec%2
  29.                 temp.append(quo)
  30.                 return Dec2Bin(dec//2)
  31.         return temp

  32. >>> Dec2Bin2(9)
  33. >>> temp
  34. [1]
  35. >>> temp
  36. [1]
  37. >>> temp=[]
  38. >>> def Dec2Bin_2(dec):
  39.         global temp
  40.         if dec//2==0:
  41.                 return temp.append(1)
  42.         else:
  43.                 quo=dec%2
  44.                 temp.append(quo)
  45.                 return Dec2Bin_2(dec//2)
  46.         return temp

  47. >>> Dec2Bin_2(9)
  48. >>> temp
  49. [1, 0, 0, 1]
  50. >>> def Dec2Bin(dec):
  51.         temp=[]
  52.         result=''
  53.         if dec//2==0:
  54.                 return temp.append(1)
  55.         else:
  56.                 quo=dec%2
  57.                 temp.append(quo)
  58.                 return Dec2Bin(dec//2)
  59.         while temp:
  60.                 result=result+str(temp.pop())
  61.         return result

  62. >>> Dec2Bin(9)
  63. >>>
复制代码


这个执行了还是没有返回额,temp.append(quo)这执行的时候,是往下走的时候,还是返回的时候。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-6-13 00:52:19 | 显示全部楼层    本楼为最佳答案   
本帖最后由 Twilight6 于 2020-6-13 00:55 编辑
lsc00844 发表于 2020-6-13 00:12
这个执行了还是没有返回额,temp.append(quo)这执行的时候,是往下走的时候,还是返回的时候。


先把这个循环去掉,如果用循环还不如直接不用递归哈
  1. while temp:
  2.                 result=result+str(temp.pop())
复制代码

还有  函数返回值在 IDLE交互界面会自动打印,而如果是在编译器编辑然后运行是不会自己打印 return 的结果的 要 加上 print(Dec2Bin(10)) 这样

列表的 大部分方法都是在原列表上进行变化 ,没有返回值 所以返回了 None

比如 append、reverse、remove、insert、extend、sort等都是没有返回值的,但是 pop 有返回值,将列表元素取出并返回

所以这边不能返回 temp.append(1),不然返回的是 None

而且 你的 if 条件有些差错,递归设置一个出口,当递归到0的时候就退出递归 返回列表

最后帮你代码改了一下:
  1. def Dec2Bin(dec):
  2.     temp = []
  3.     if dec == 0:
  4.         return temp
  5.     else:
  6.         quo = dec % 2
  7.         temp.append(quo)
  8.         return Dec2Bin(dec // 2)+temp

  9. print(Dec2Bin(10))
复制代码

因为你返回的是列表 所以打印的结果也是列表,所以递归结束时候你可以这样打印:
  1. def Dec2Bin(dec):
  2.     temp = []
  3.     if dec == 0:
  4.         return temp
  5.     else:
  6.         quo = dec % 2
  7.         temp.append(quo)
  8.         return Dec2Bin(dec // 2)+temp
  9.    
  10. print('0b',end='')
  11. for i in Dec2Bin(10):
  12.     print(i,end='')
复制代码

输出结果是:
  1. >>> 0b1010
复制代码

0b 开头代表着数字是二进制数字

弄成字符串更好,直接拼接就可以:
  1. def Dec2Bin(dec):
  2.     temp = ''
  3.     if dec == 0:
  4.         return temp
  5.     else:
  6.         temp += str(dec%2)
  7.         return Dec2Bin(dec // 2)+temp

  8. print('0b'+Dec2Bin(10))
复制代码

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

使用道具 举报

发表于 2020-6-13 00:56:22 | 显示全部楼层
  1. def dec2bin(dec):
  2.     if dec == 0 : return ''
  3.     else : return dec2bin(dec // 2) + str(dec % 2)
  4. print(dec2bin(9))
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-6-13 02:11:42 | 显示全部楼层
Twilight6 发表于 2020-6-13 00:52
先把这个循环去掉,如果用循环还不如直接不用递归哈

还有  函数返回值在 IDLE交互界面会自动打印, ...
  1. def Dec2Bin(dec):
  2.         temp=[]
  3.         if dec==0:
  4.                 return temp
  5.         else:
  6.                 quo=dec%2
  7.                 temp.append(quo)
  8.                 return Dec2Bin(dec//2)
  9.         return temp

  10. >>> Dec2Bin(9)
  11. []
复制代码


这个quo=dec%2
       temp.append(quo)
这两行代码,是在递归,进去的时候执行的,还是出来的时候执行的?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-6-13 02:14:14 | 显示全部楼层
Twilight6 发表于 2020-6-13 00:52
先把这个循环去掉,如果用循环还不如直接不用递归哈

还有  函数返回值在 IDLE交互界面会自动打印, ...

感谢大神,看懂了,应为return 的None,所以没反应。。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-6-13 02:17:34 | 显示全部楼层
Twilight6 发表于 2020-6-13 00:52
先把这个循环去掉,如果用循环还不如直接不用递归哈

还有  函数返回值在 IDLE交互界面会自动打印, ...

这个quo=dec%2
       temp.append(quo)
这两行代码,是在递归,进去的时候执行的,还是出来的时候执行的?
如果是递归进去的时候执行的,执行到dec==0,返回temp,这个时候的temp是有东西的
temp就是倒数第二层Dec2Bin(1//2)这个函数的返回值,应该可以一步一步的返回到最初的Dec2Bin(dec)的吧?
可是去掉最后的+temp,就返回一个空列表
这里没搞懂是怎么递归回去的。。感谢感谢
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-6-13 02:24:38 | 显示全部楼层

大神,这代码没看懂。。
后面的+str(dec%2)
这一部分加哪里去了,后面的这一部分是和dec2bin(dec//2)一起往下执行,还是另外分了一条线..
对递归理解的还不透彻。
感谢~
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-6-13 02:55:30 | 显示全部楼层
  1. >>> def Dec2Bin(dec):
  2.         def fun1(dec):
  3.             temp = []
  4.             if dec == 0:
  5.                 return temp
  6.             else:
  7.                 quo = dec % 2
  8.                 temp.append(quo)
  9.                 return fun1(dec // 2)+temp
  10.         result='0b'
  11.         for i in fun1(dec):
  12.                 result=result+str(i)
  13.         return result

  14. >>> Dec2Bin(9)
  15. '0b1001'
  16. >>> Dec2Bin(999)
  17. '0b1111100111'
  18. >>> bin(999)
  19. '0b1111100111'
  20. >>>
复制代码


函数又优化了下,可以直接出结果了。。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-6-13 07:16:22 | 显示全部楼层
lsc00844 发表于 2020-6-13 02:17
这个quo=dec%2
       temp.append(quo)
这两行代码,是在递归,进去的时候执行的,还是出来的时候执行 ...

只有最后一次递归执行的是 :
  1. if dec==0:
  2.         return temp
复制代码

其他都是在执行
  1. else:
  2.             quo=dec%2
  3.             temp.append(quo)
  4.             return Dec2Bin(dec//2)
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-6-13 07:19:13 | 显示全部楼层
本帖最后由 xiaosi4081 于 2020-6-13 07:21 编辑

送你一张图:
202824hm7m31mnm1mk26mm.jpg.thumb.jpg
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-6-13 08:32:03 | 显示全部楼层
Twilight6 发表于 2020-6-12 23:58
....啊,外星人,羡慕!

建议下个截屏软件 ,这样拍照不觉得麻烦嘛,还要传电脑

我怀疑他是来炫耀电脑的
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-6-13 08:34:22 | 显示全部楼层
永恒的蓝色梦想 发表于 2020-6-13 08:32
我怀疑他是来炫耀电脑的

同感 ,楼主土豪 我们交个朋友吧
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-6-13 17:36:39 | 显示全部楼层

哈哈哈,学会了,一定改正
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-6-13 17:37:16 | 显示全部楼层
永恒的蓝色梦想 发表于 2020-6-13 08:32
我怀疑他是来炫耀电脑的

随手拍的。。以后还是用截图。。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-6-13 17:37:56 | 显示全部楼层
Twilight6 发表于 2020-6-13 08:34
同感 ,楼主土豪 我们交个朋友吧

就是单纯的学编程。。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-6-13 17:38:28 | 显示全部楼层
lsc00844 发表于 2020-6-13 17:37
就是单纯的学编程。。

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-6-21 17:49

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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