鱼C论坛

 找回密码
 立即注册
查看: 1832|回复: 3

[已解决]23,24课后动动手 第0题 转换二进制

[复制链接]
发表于 2017-6-10 18:58:59 | 显示全部楼层 |阅读模式

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

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

x
本帖最后由 hyftee 于 2017-6-11 22:52 编辑

def bin1(x):
    if x:
        return(bin1(x//2) + str(x%2))
这个函数在我第一次完成测试的时候 输入数字是正常显示转换出的二进制字符串
关掉后shell后再调用却出现这个报错

bin1(4)
Traceback (most recent call last):
  File "<pyshell#18>", line 1, in <module>
    bin1(4)
  File "C:\Users\19579\AppData\Local\Programs\Python\Python36\递归bin()函数.py", line 3, in bin1
    return(bin1(x//2) + str(x%2))
  File "C:\Users\19579\AppData\Local\Programs\Python\Python36\递归bin()函数.py", line 3, in bin1
    return(bin1(x//2) + str(x%2))
  File "C:\Users\19579\AppData\Local\Programs\Python\Python36\递归bin()函数.py", line 3, in bin1
    return(bin1(x//2) + str(x%2))
TypeError: unsupported operand type(s) for +: 'NoneType' and 'str'

显示有个Nonetype

然后我将函数改为

def bin1(x):
    if x:
        return(str(bin1(x//2)) + str(x%2))

>>> bin1(19)
'None10011'

None被转为一个字符串输出了


一个问题是.这个None是不是在x等于0的时候产生的,如果是的话怎么更改好
还有一个问题是我确认第一次调用确认是执行成功的 为什么关掉shell后重新调用就报错了


-------------------------------------------------------------------------
感谢大家解答 我取巧将函数改成这样了 输出和bin()一样了
def bin1(x):
    if x:
        return(bin1(x//2) + str(x%2))
    else:
        return('0b')

测试
>>> bin(9)
'0b1001'
>>> bin1(9)
'0b1001'
>>> bin(56789)
'0b1101110111010101'
>>> bin1(56789)
'0b1101110111010101'
>>>

------------------------------------------------------------------------
在做第二题的时候想到一个终极方案
在x为0时直接返回一个''完美解决
def bin1(x):
    if x:
        return(bin1(x//2) + str(x%2))
    else:
        return''

>>> bin1(789456)
'11000000101111010000'
>>> bin(789456)
'0b11000000101111010000'
>>>
最佳答案
2017-6-10 19:43:41
你的程序如果递归到x=0,则会返回None,所以会报错。
除了小甲鱼的答案外,按照你的程序做个修改如下:
  1. def bin1(x):
  2.     if x == 0:
  3.         return '0'
  4.     elif x == 1:
  5.         return '1'
  6.     else:
  7.         return bin1(x//2) + str(x%2)
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2017-6-10 19:43:41 | 显示全部楼层    本楼为最佳答案   
你的程序如果递归到x=0,则会返回None,所以会报错。
除了小甲鱼的答案外,按照你的程序做个修改如下:
  1. def bin1(x):
  2.     if x == 0:
  3.         return '0'
  4.     elif x == 1:
  5.         return '1'
  6.     else:
  7.         return bin1(x//2) + str(x%2)
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-6-10 19:47:03 | 显示全部楼层
第一个问题的确是X等于0的时候返回None

你的代码if条件改成x大于0
然后下面else 添加x等于0的时候的代码就OK了

报错是有报错原因的,你不把报错信息贴上来,怎么给你分析
就代码而言,只要缩进没问题 就不会报错

评分

参与人数 1鱼币 +5 收起 理由
hyftee + 5 感谢解答,可能我表述不清,我是说我发的函数.

查看全部评分

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

使用道具 举报

发表于 2017-6-10 21:29:48 | 显示全部楼层
冬雪雪冬 发表于 2017-6-10 19:43
你的程序如果递归到x=0,则会返回None,所以会报错。
除了小甲鱼的答案外,按照你的程序做个修改如下:

给思路 别给代码。
让自己思考
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-2-27 23:15

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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