为了改进rnbguy的答案,我发现当您的输入是除 之外的任何数字时0
,它实际上确实返回了二进制表示,'0'
最后带有一个附加值。
要删除它,我想出的唯一解决方案是添加一个全局变量,该变量记住模数的先前值n%2
:
prev = 0
def dec2bin(n):
global prev
if n < 0:
return 'Must be a positive integer'
elif n == 0:
if prev == 0:
return '0'
else:
prev = 0
return ''
else:
m = n%2
prev = m
return dec2bin(n//2) + str(m)
这背后的原因是当你尝试divmod(0, 2)
输出时(0, 0)
,所以我们知道输出必须是简单的'0'
。但是,如果我们有一个大于 0 的数字,递归函数将始终结束除法1//2
,1%2
并且输出与 相同divmod(1, 2) == (0, 1)
。
为了在我们的输出结束时规避另一个'0'
,我们会将1
of保存1%2
在全局变量中,并在第二种情况下prev
检查它,因为我们目前有.prev != 0
n = 0
之前:
>>> print dec2bin(22)
010110
>>> print dec2bin(0)
0
之后:
>>> print dec2bin(22)
10110
>>> print dec2bin(0)
0
请注意,我们必须在prev = 0
旁边添加return ''
,否则print dec2bin(0)
自上次执行的代码将设置prev
为1
.