递归二进制到十进制

问题描述 投票:0回答:5

我正在使用 C++ 编写一个程序,该程序使用递归将用户输入的二进制数转换为十进制数。我已经玩这个代码几个小时了

(之前我用

i
初始化了
i = binary.length();

    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 个小数作为返回。但我得到了 0.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;
    }
}
c++ recursion
5个回答
3
投票

假设您使用的是小端,则应该使用

pow(2, i)
。使用
i-1
,数组中的位置 0 处将有 1,这意味着您将评估
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
来修改。


1
投票
class trip

 {
    
     int convert2(int N, int i)
    {
        if(N!=0)
        {
            return (N%10)*((int)Math.pow(2,i))+convert2(N/10,i+1);
        }
        else
        {
            return 0;
        }
    }
}

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
投票
int de(int no,int e=0){
    if(no==0){
        return 0;
    }
    int last = no%10;
    if(last==1){
        int ex=pow(2,e);
        return ex+de(no/10,e+1);
    } else{
        return de(no/10,e+1);
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.