【问题标题】:How could I convert Binary into Decimal using recursive way?如何使用递归方式将二进制转换为十进制?
【发布时间】:2017-03-26 20:18:30
【问题描述】:

我基本上都完成了.. 我只是找不到将每个整数乘以 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(binaryString)-1])

如果我输入了“1000”,我返回字符串的最后一位,并通过消除最后一位进行递归,因此,“1000”-->“100”-->“10”等等

这里的问题是我找不到将最后一位数字乘以其对应的 2 的幂的方法。当二进制字符串的长度为 4,3,2 时,如何获得 0,1,2,3 的任何想法, 1 ?

【问题讨论】:

  • 顺便说一句,你可以return int(binaryString, 2)

标签: python python-3.x recursion


【解决方案1】:

你让这变得比它需要的更复杂。无需计算功率。

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

此函数还可以正确处理前导零:

for i in range(16):
    b = format(i, '05b')
    n = binary_to_decimal(b)
    print('{:2} {} -> {}'.format(i, b, n)) 

输出

 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')

【讨论】:

  • 哇哦...用这种方式简单多了,谢谢大家的帮助
【解决方案2】:

如果您尝试递归解析数字(作为练习),请查看以下内容:

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_string, 2)

【讨论】:

  • 你可以默认power = 0,那么参数就不需要传了
  • @cricket_007 但它仍然存在。这是一个适当的包装。
猜你喜欢
  • 2016-06-27
  • 2012-04-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-09
  • 2013-09-23
  • 2020-06-19
  • 1970-01-01
相关资源
最近更新 更多