鱼C论坛

 找回密码
 立即注册
查看: 1136|回复: 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)这执行的时候,是往下走的时候,还是返回的时候。


先把这个循环去掉,如果用循环还不如直接不用递归哈
while temp:
                result=result+str(temp.pop())
还有  函数返回值在 IDLE交互界面会自动打印,而如果是在编译器编辑然后运行是不会自己打印 return 的结果的 要 加上 print(Dec2Bin(10)) 这样

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

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

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

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

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

print(Dec2Bin(10))
因为你返回的是列表 所以打印的结果也是列表,所以递归结束时候你可以这样打印:
def Dec2Bin(dec):
    temp = []
    if dec == 0:
        return temp
    else:
        quo = dec % 2
        temp.append(quo)
        return Dec2Bin(dec // 2)+temp
    
print('0b',end='')
for i in Dec2Bin(10):
    print(i,end='')
输出结果是:
>>> 0b1010
0b 开头代表着数字是二进制数字

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

print('0b'+Dec2Bin(10))
微信图片_20200612235503.jpg
微信图片_20200612235511.jpg
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

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

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

snipaste 这个截屏软件好用  F1 截屏
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

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

前面拍的照,在群里问了下没人回复。。就发这来了,后面还是截图好。
想知道小甲鱼最近在做啥?请访问 -> 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 有返回值,将列表元素取出并返回
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

比如 append、reverse、 ...
>>> def Dec2Bin(dec):
        temp=[]
        if dec//2==0:
                return temp.append(1)
        else:
                quo=dec%2
                temp.append(quo)
                return Dec2Bin(dec//2)
        return temp

>>> Dec2Bin(9)
>>> def Dec2Bin(dec):
        temp=[]
        if dec//2==0:
                return temp.append(1)
        else:
                quo=dec%2
                temp.append(quo)
                return Dec2Bin(dec//2)
        print(temp)

        
>>> Dec2Bin(9)
>>> temp=[]
>>> def Dec2Bin2(dec):
        global temp
        if dec//2==0:
                return temp.append(1)
        else:
                quo=dec%2
                temp.append(quo)
                return Dec2Bin(dec//2)
        return temp

>>> Dec2Bin2(9)
>>> temp
[1]
>>> temp
[1]
>>> temp=[]
>>> def Dec2Bin_2(dec):
        global temp
        if dec//2==0:
                return temp.append(1)
        else:
                quo=dec%2
                temp.append(quo)
                return Dec2Bin_2(dec//2)
        return temp

>>> Dec2Bin_2(9)
>>> temp
[1, 0, 0, 1]
>>> def Dec2Bin(dec):
        temp=[]
        result=''
        if dec//2==0:
                return temp.append(1)
        else:
                quo=dec%2
                temp.append(quo)
                return Dec2Bin(dec//2)
        while temp:
                result=result+str(temp.pop())
        return result

>>> Dec2Bin(9)
>>> 

这个执行了还是没有返回额,temp.append(quo)这执行的时候,是往下走的时候,还是返回的时候。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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


先把这个循环去掉,如果用循环还不如直接不用递归哈
while temp:
                result=result+str(temp.pop())
还有  函数返回值在 IDLE交互界面会自动打印,而如果是在编译器编辑然后运行是不会自己打印 return 的结果的 要 加上 print(Dec2Bin(10)) 这样

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

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

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

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

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

print(Dec2Bin(10))
因为你返回的是列表 所以打印的结果也是列表,所以递归结束时候你可以这样打印:
def Dec2Bin(dec):
    temp = []
    if dec == 0:
        return temp
    else:
        quo = dec % 2
        temp.append(quo)
        return Dec2Bin(dec // 2)+temp
    
print('0b',end='')
for i in Dec2Bin(10):
    print(i,end='')
输出结果是:
>>> 0b1010
0b 开头代表着数字是二进制数字

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

print('0b'+Dec2Bin(10))
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-6-13 00:56:22 | 显示全部楼层
def dec2bin(dec):
    if dec == 0 : return ''
    else : return dec2bin(dec // 2) + str(dec % 2)
print(dec2bin(9))
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

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

>>> Dec2Bin(9)
[]

这个quo=dec%2
       temp.append(quo)
这两行代码,是在递归,进去的时候执行的,还是出来的时候执行的?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

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

感谢大神,看懂了,应为return 的None,所以没反应。。
想知道小甲鱼最近在做啥?请访问 -> 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,就返回一个空列表
这里没搞懂是怎么递归回去的。。感谢感谢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

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

使用道具 举报

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

>>> Dec2Bin(9)
'0b1001'
>>> Dec2Bin(999)
'0b1111100111'
>>> bin(999)
'0b1111100111'
>>> 

函数又优化了下,可以直接出结果了。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

只有最后一次递归执行的是 :
if dec==0:
        return temp
其他都是在执行
else:
            quo=dec%2
            temp.append(quo)
            return Dec2Bin(dec//2)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

送你一张图:
202824hm7m31mnm1mk26mm.jpg.thumb.jpg
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

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

我怀疑他是来炫耀电脑的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

同感 ,楼主土豪 我们交个朋友吧
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

哈哈哈,学会了,一定改正
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

随手拍的。。以后还是用截图。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

就是单纯的学编程。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

哈哈哈
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-1-20 16:59

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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