2014-11-02 145 views
1

我正在使用C++編寫一個程序,該程序使用遞歸將用戶輸入二進制數轉換爲小數。我打這個代碼小時遞歸二進制到十進制

(前面我i = binary.length();初始化i

void bin2dec(string binary, int i) 
{ 
    double decNum=0; 

    if (i >= 0) 
    { 
     if (binary[i] = 0) 
     { 
      decNum = (decNum + 0); 
     } 
     else 
     { 
      decNum = (decNum + pow(2, (i-1))); 
     } 
     bin2dec(binary, i-1); 
    } 
    cout << decNum; 
} 

這是我的遞歸函數。不幸的是,我被卡住了。該程序運行,但給我不正確的值。例如,當我插入1作爲二進制文件時,我期望得到1位小數。但我得到.5號碼。我的計算是錯誤的還是我錯誤地使用了遞歸?

在收到建議後,我做了以下更改。但是,程序仍會返回不正確的值。

void bin2dec(string binary, int i) 
{ 
    double decNum=0; 
    if (i >= 0) 
    { 
     if (binary[i] == 1) 
     { 
      decNum = (decNum + pow(2, i)); 
     } 
     else if (binary[i] == 0) 
     { 
      decNum = (decNum + 0); 
     } 
     bin2dec(binary, i - 1); 
     cout << decNum; 
    } 
} 
+0

我從來沒有想過在BIN2DEC轉換使用遞歸!你是否意識到「decNum」是一個局部變量,並且在每次調用中總是初始化爲零? – Jdamian 2014-11-02 16:31:03

+1

@Jdamian看起來她只是寫它輸出,因爲它沒有任何方法可以將數字返回給調用者。 – IllusiveBrian 2014-11-02 16:36:02

+0

你知道爲什麼,在你的例子中,值2 ^( - 1),即0.5返回? – Jdamian 2014-11-02 16:36:37

回答

3

假設您使用的是小端,您應該使用pow(2, i)。用i-1,你將在數組中有0個位置,這意味着你將評估pow(2, -1),這是0.5。

考慮這個工作示例(https://ideone.com/pWVAGP):

int bintodec(string binary, unsigned int i = 0) 
{ 
    int tot = 0; 
    if (i < binary.length()) 
    { 
     if (binary[i] == '1') 
      tot = pow(2, i); 
     else if (binary[i] != '0') 
      throw "String is not formatted in binary"; 
     return tot + bintodec(binary, ++i); 
    } 
    return tot; 
} 

注意,它可能開始在字符串的結束和向後工作,但我更喜歡從0開始,因爲我認爲這是簡單的。要完成添加,最簡單的方法是返回該函數的另一個調用,就像我在if(i < binary.length()塊的末尾所做的那樣。一旦你擊中基本情況(在這種情況下,i == binary.length()),返回一個0,它被添加到總數,但不會改變它。一旦基本情況已經返回,其他人將開始將他們的部分返回到他們上面的部分,這些部分不斷增加,直到它到達調用堆棧的底部,這是最初的調用函數。

如果你不想返回答案,你可以在函數簽名更改爲void bintodec(int& tot, string binary, unsigned int i = 0)和不斷增加的價值tot而不是返回它,但它需要您的來電者給你一個int修改。

+0

但是當二進制是1000(i = 4)時會發生什麼。十進制應該是2^3,而不是2^4。 – 2014-11-02 16:33:52

+0

@SashaMiko在這種情況下,'i'將等於3.請記住,數組是零索引的。作爲一個附註,你的程序1000等於1,是你的意圖嗎? – IllusiveBrian 2014-11-02 16:34:30

+0

@SashaMiko爲什麼你希望在整數值時使用double值? – Jdamian 2014-11-02 16:40:02

0

上述算法的稍微改進的版本;不使用pow()功能是:

int btod_r(int n, int p = 0) { 
    if(n == 0) return 0; 
    if(p == 0) return n%10 + btod_r(n/10, 2); 
    return (n%10) * p + btod_r(n/10, 2*p); 
} 

注:這裏的二進制輸入爲int,有一個小的修改,您可以在重新編寫接受string代替。

0

解決方案:

int bin2dec(long long num) 
{ 
    if(num==0) return 0; 
    return num%10+2*bin2dec(num/10); 
} 
+0

雖然這段代碼可能會回答這個問題,但提供了關於爲什麼和/或這個代碼的附加上下文回答這個問題提高了它的長期價值。 – rollstuhlfahrer 2018-02-22 09:27:53