2016-11-12 113 views
1

我基本完成一切.. 我無法找到一個方法來乘以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'等等

這裏的問題是,我只是無法找到一種方法來乘以它的相應冪的最後一位數字。當二進制串的長度是4,3,2,1時,如何得到0,1,2,3的任何想法?

+2

順便說一句,你可以只'返回INT(binaryString,2)' –

回答

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

哦哇......用這種方式更容易,更簡單,謝謝你的幫助 –

0

如果你想遞歸解析號(作爲運動)再看看這個:

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)

+0

你可以默認'power = 0',那麼參數不需要通過 –

+0

@ cricket_007但它仍然存在。這是一個適當的包裝。 – freakish

相關問題