鱼C论坛

 找回密码
 立即注册
查看: 711|回复: 9

[已解决]大佬们!我用递归写十进制转二进制发现几个问题,求解答!

[复制链接]
发表于 2020-5-9 15:59:54 | 显示全部楼层 |阅读模式

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

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

x
代码如下
import sys
sys.setrecursionlimit(1000000)    #递归一百万层

def f(x):
    global answer                        #answer是一个数组,用来存放算出来的二进制数。这里global加不加都行,不明白为什么
    if x//2 != 0:                                #将x整除2,得到结果两种可能,要么1要么0。再根据1或0去判断要不要继续除下去,记录余数并函数循环调用
        t = x%2
        answer.append(t)
        return f(x//2)
    else:
        answer.append(1)
        return answer.reverse()

x = 7                                        #尝试把7转化为二进制数
answer = []

print(f(x))
print(answer)
print(x)

输出结果
=======
None
[1, 1, 1]
7


---------------
虽然输出【1,1,1】答案对了,但是我不明白的是:
为什么print(f(x)),输出是 None?
为什么print(answer)能直接输出函数f(x)里改变后的量【1,1,1】而不是【】,和它一样被设置的 x =7 ,print(x)后却还是7?
我设置的answer=[]和x=7在这段程序里算什么?是全局变量吗?如果是,那么f(x)运行时改变的answer只能存在函数里,我在函数f(x)外print输出应该还是answer=[]和x=7吧?
关于global,它的作用是不是使一个局部变量X发生变化时,全局变量X也跟着它一起变?

------------------------
我的问题有点多,有点不太好意思,若能解答我衷心感谢(没多少鱼币了,也不知道哪里发起悬赏  )
最佳答案
2020-5-9 16:07:18
1,因为列表的大部分方法都没有返回值,所以你最后那个answer.reverse()是不正确的,
而你的代码最后会返回这个,一层又一层,最后还是None。
2,因为你没有在代码中改变x,你只有x//2,但没有赋值给x。
而且,你需要global x才可以改变x。
(列表,元组等数据结构不需要global)
3,和第二题一样,数据结构没有全局,局部这一说,
哪里都能访问这个(除非定义在函数里面)。
4,是的
5,我想要最佳,不想要鱼币
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-5-9 16:07:18 | 显示全部楼层    本楼为最佳答案   
1,因为列表的大部分方法都没有返回值,所以你最后那个answer.reverse()是不正确的,
而你的代码最后会返回这个,一层又一层,最后还是None。
2,因为你没有在代码中改变x,你只有x//2,但没有赋值给x。
而且,你需要global x才可以改变x。
(列表,元组等数据结构不需要global)
3,和第二题一样,数据结构没有全局,局部这一说,
哪里都能访问这个(除非定义在函数里面)。
4,是的
5,我想要最佳,不想要鱼币
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-5-9 16:33:39 | 显示全部楼层
qiuyouzhi 发表于 2020-5-9 16:07
1,因为列表的大部分方法都没有返回值,所以你最后那个answer.reverse()是不正确的,
而你的代码最后会返 ...

明白了,谢谢大佬!我改了一下现在可以直接打印f(x)了
import sys
sys.setrecursionlimit(1000000)

def f(x):
    if x//2 != 0:
        t = x%2
        answer.append(t)
        return f(x//2)
    else:
        answer.append(1)
        answer.reverse()        #这个没有返回值,所以不能把它交给return输出
        return answer

x = 46
answer = []
print(f(x))
print(answer)
print(x)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-5-9 16:34:04 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-5-9 16:34:50 | 显示全部楼层
qiuyouzhi 发表于 2020-5-9 16:07
1,因为列表的大部分方法都没有返回值,所以你最后那个answer.reverse()是不正确的,
而你的代码最后会返 ...

悬赏的最佳是不是不算最佳
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-5-9 16:36:55 | 显示全部楼层
老八秘制 发表于 2020-5-9 16:34
悬赏的最佳是不是不算最佳

回答悬赏没有技术值
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-5-9 20:50:11 | 显示全部楼层
qiuyouzhi 发表于 2020-5-9 16:36
回答悬赏没有技术值

技术值比鱼币值钱
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-5-9 20:52:50 | 显示全部楼层
老八秘制 发表于 2020-5-9 20:50
技术值比鱼币值钱

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

使用道具 举报

发表于 2020-5-9 20:53:59 | 显示全部楼层

技术值能领勋章,鱼币不能(除了最后一个鱼币买的,还不是永久的)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-5-9 20:55:22 | 显示全部楼层
老八秘制 发表于 2020-5-9 20:53
技术值能领勋章,鱼币不能(除了最后一个鱼币买的,还不是永久的)

那个勋章要是永久就好了
我准备买一个(我可以买俩
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-27 06:40

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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