递归二进制到十进制

问题描述:

我正在使用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

假设您使用的是小端,您应该使用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

上述算法的稍微改进的版本;不使用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代替。

解决方案:

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