Python 如何使用递归方式将二进制转换为十进制?
我基本上完成了一切。。 我就是找不到一种方法把每个整数乘以2^0,2^1。。。等等 这是我的密码Python 如何使用递归方式将二进制转换为十进制?,python,python-3.x,recursion,Python,Python 3.x,Recursion,我基本上完成了一切。。 我就是找不到一种方法把每个整数乘以2^0,2^1。。。等等 这是我的密码 def BinaryToDecimal(binaryString): if len(binaryString) == 0: return 0 else: return int(binaryString[-1:])*(2**(4-len(binaryString))) + BinaryToDecimal(binaryString[:len(binaryS
def BinaryToDecimal(binaryString):
if len(binaryString) == 0:
return 0
else:
return int(binaryString[-1:])*(2**(4-len(binaryString))) + BinaryToDecimal(binaryString[:len(binaryString)-1])
如果输入了“1000”,则返回字符串的最后一个数字,并通过消除最后一个数字来进行递归,如“1000”-->“100”-->“10”,依此类推
这里的问题是,我无法找到一种方法,将最后一个数字乘以其相应的2次方。当二进制字符串的长度为4,3,2,1时,有没有想过如何得到0,1,2,3?如果您尝试递归解析一个数字(作为练习),那么请查看以下内容:
def parse_binary(binary_string, power):
if len(binary_string) == 0:
return 0
last_digit = int(binary_string[-1]) * (2**power)
return last_digit + parse_binary(binary_string[:-1], power+1)
def BinaryToDecimal(binary_string):
return parse_binary(binary_string, 0)
但是,如果您想有效地执行此操作,只需调用
int(binary\u string,2)
,您将使此操作变得更加复杂。不需要进行功率计算
def binary_to_decimal(bstring):
if not bstring:
return 0
return binary_to_decimal(bstring[:-1]) * 2 + int(bstring[-1])
# Test
for i in range(16):
b = format(i, 'b')
n = binary_to_decimal(b)
print('{:2} {:4} -> {}'.format(i, b, n))
输出
0 0 -> 0
1 1 -> 1
2 10 -> 2
3 11 -> 3
4 100 -> 4
5 101 -> 5
6 110 -> 6
7 111 -> 7
8 1000 -> 8
9 1001 -> 9
10 1010 -> 10
11 1011 -> 11
12 1100 -> 12
13 1101 -> 13
14 1110 -> 14
15 1111 -> 15
0 00000 -> 0
1 00001 -> 1
2 00010 -> 2
3 00011 -> 3
4 00100 -> 4
5 00101 -> 5
6 00110 -> 6
7 00111 -> 7
8 01000 -> 8
9 01001 -> 9
10 01010 -> 10
11 01011 -> 11
12 01100 -> 12
13 01101 -> 13
14 01110 -> 14
15 01111 -> 15
此函数还可以正确处理前导零:
for i in range(16):
b = format(i, '05b')
n = binary_to_decimal(b)
print('{:2} {} -> {}'.format(i, b, n))
输出
0 0 -> 0
1 1 -> 1
2 10 -> 2
3 11 -> 3
4 100 -> 4
5 101 -> 5
6 110 -> 6
7 111 -> 7
8 1000 -> 8
9 1001 -> 9
10 1010 -> 10
11 1011 -> 11
12 1100 -> 12
13 1101 -> 13
14 1110 -> 14
15 1111 -> 15
0 00000 -> 0
1 00001 -> 1
2 00010 -> 2
3 00011 -> 3
4 00100 -> 4
5 00101 -> 5
6 00110 -> 6
7 00111 -> 7
8 01000 -> 8
9 01001 -> 9
10 01010 -> 10
11 01011 -> 11
12 01100 -> 12
13 01101 -> 13
14 01110 -> 14
15 01111 -> 15
实际上,如果我们假设只传递有效字符串,我们甚至不需要调用
int
:
def binary_to_decimal(bstring):
if not bstring:
return 0
return binary_to_decimal(bstring[:-1]) * 2 + (bstring[-1] == '1')
顺便说一下,您可以
返回int(binaryString,2)
您可以默认power=0
,那么参数就不需要了passed@cricket_007但它仍然在那里。那是一个合适的包装。哦,哇。。。使用这种方式更容易、更简单,谢谢您的帮助