C++ 递归函数,用于从二进制文件列表中获取十进制数

C++ 递归函数,用于从二进制文件列表中获取十进制数,c++,recursion,C++,Recursion,如果我有一个包含N个表示二进制数的元素的列表,并且每个节点(我将其命名为info)都是布尔值(true=1,false=0),那么使用递归函数获取十进制值的最佳方法是什么 我尝试使用谷歌,但我只提供了十进制的公式 1 * 2N + 0 * 2N-1 + 0 * 2N-2 + ... + 1 * 21 + 1 * 20 根据我对问题的理解,现在我有了一个标题和一些方法的基本结构。还有一个问题是,第一个数字是最有意义的,但我不太明白这是否相关 int Lista:: Convie

如果我有一个包含N个表示二进制数的元素的列表,并且每个节点(我将其命名为info)都是布尔值(true=1,false=0),那么使用递归函数获取十进制值的最佳方法是什么

我尝试使用谷歌,但我只提供了十进制的公式

1 * 2N  +  0 * 2N-1   + 0 * 2N-2  + ... + 1 * 21  +   1 * 20 
根据我对问题的理解,现在我有了一个标题和一些方法的基本结构。还有一个问题是,第一个数字是最有意义的,但我不太明白这是否相关

int Lista:: ConvierteBinarioDecimal ( void ) const;
static int suma= 0;


ConvierteBinarioDecimal();
}
return suma;
}
和Nodo(node)类


我上周开始学习C++,到目前为止,它比java语言更难。所以任何帮助都是天赐之物。 最快的方法之一是使用位移位操作。例如:

long decimal = 0;
Nodo * current = primero;
unsigned int bitcounter = 0;

while(current)
{
    if(current->getInfo)
    {
        long temp = 1;
        temp << bit counter;
        decimal |= temp;
    }
    bitcounter++;
    current = current->next;
}
ConvierteBinarioDecimal()
{
int-indice=纵向;
Nodo*corriente=primero;//当前,从第一个节点开始
while(corriente!=null)
{
如果(corriente->getInfo())
suma+=1 getNext();//转到下一个节点
}
}

我希望西班牙人也能帮上忙!:)

这是一个递归示例:

我必须做一些小的修改,将const添加到getInfo(这里没有问题)并将const添加到getNext(您可能还需要非const版本),问题是函数
conviertbiariodecimal
被声明为
const
,这很好(计算十进制表示法无需更改任何内容,但这强制要求两种方法必须是
const
)如果需要,您可以添加非const版本

静态int ConvierteBinarioDecimal(Nodo const*node){
是从二进制转换为十进制的递归实现。如果需要递归,这是示例代码,如果可以使用迭代版本,性能会更好

#include <algorithm>
#include <iostream>
#include <vector>
#include <memory>

using namespace std;

class Nodo {
public:
    bool getInfo(void) const { return info; }  // Retorns the content of info
    Nodo* getNext(void) const { return next; } // Retorns the cotent of next

    Nodo(bool i, Nodo* n) : info(i), next(n) {}

private:
    bool info;
    Nodo* next;
};

class Lista {
    Nodo* primero;
    int longitud;
public:
    int ConvierteBinarioDecimal(void) const;
    Lista(Nodo* p, int l) : primero(p), longitud(l) {}
};

static int ConvierteBinarioDecimal(Nodo const* node, int decimal = 0) {
    if (node == NULL) // prefer C++11 nullptr
        return decimal;
    decimal *= 2;
    if (node->getInfo())
        decimal++;
    return ConvierteBinarioDecimal(node->getNext(), decimal);
}

int Lista::ConvierteBinarioDecimal(void) const {
    return ::ConvierteBinarioDecimal(primero);
}

int main(int argc, char* argv[]) {
    Lista list(new Nodo(true, new Nodo(false, new Nodo(true, new Nodo(true, NULL)))), 4);
    std::cout << list.ConvierteBinarioDecimal() << std::endl;
    return 0;
}
#包括
#包括
#包括
#包括
使用名称空间std;
野藤班{
公众:
bool getInfo(void)const{return info;}//returns info的内容
Nodo*getNext(void)const{return next;}//returns next的内容
Nodo(bool i,Nodo*n):信息(i),下一个(n){}
私人:
布尔信息;
Nodo*下一步;
};
Lista类{
诺多*普里梅罗;
内长;
公众:
int ConvierteBinarioDecimal(void)const;
Lista(Nodo*p,intl):primero(p),longitud(l){
};
静态int ConvierteBinarioDecimal(Nodo const*node,int decimal=0){
if(node==NULL)//更喜欢C++11 nullptr
返回小数;
十进制*=2;
如果(节点->获取信息())
十进制++;
返回conviertBinarioDecimal(节点->getNext(),十进制);
}
int Lista::ConvierteBinarioDecimal(void)常量{
返回:ConvierteBinarioDecimal(primero);
}
int main(int argc,char*argv[]){
Lista列表(new Nodo(true,new Nodo(false,new Nodo(true,new Nodo(true,NULL))),4);

std::cout By
decimal
你的意思是
int
?是的,实际上感谢你提醒我。这很接近,但不正确。问题是第一个数字是最重要的,但你认为它是最不重要的。这确实有效!非常感谢。但是要使函数递归,我只需要添加一个对自身的调用在底部?顺便说一句,谢谢你的西班牙语,我的英语通常更好,但我的键盘现在坏了。啊,要使它递归,你必须做一些更改。我将编辑我的答案以显示这一点。非常感谢,特别是为我解释它,我必须进一步研究代码才能真正理解,但你的解释是错误的ice启动。@NetVipeC His代码(原型)建议他在不向递归函数使用参数的情况下执行此操作。然后,您需要向
Nodo
添加一个方法,以调用
Lista
方法。提供的代码有另一个
free函数
名为
ConvierteBinarioDecimal
,返回
suma
(我假设是转换存储的地方。我认为消除
静态变量
免费方法
,只添加一个帮助方法,这是一个非常好的折衷办法。对代码进行了一些修改,以前二进制文件的计算是从低到高的有效位,现在需要从高到低的有效位样本中的测试调用为(真、假、真、真)或1011二进制=11十进制。
long ConvertBinaryToDecimal()
{ 
    static long decimal = 0;
    static Nodo * current = primero;

    // Base case
    if(!current)
    {
        current = primero;
        long result = decimal;
        decimal = 0;
        return result; 
    }
    else {
        decimal = decimal<<1;
        if(primero->getInfo())
            decimal |= 1;

        current = current->next;
        ConvertBinaryToDecimal();
}
ConvierteBinarioDecimal()
{
    int indice = longitud;
    Nodo *corriente = primero; // current, begin at first node
    while (corriente != null)
    {
        if (corriente->getInfo())
            suma += 1 << --indice; // use bitshifting to add this binary digit
            // alternatively, this could be "suma |= 1 << --indice;"
        corriente = corriente->getNext(); // go to next node
    }
}
#include <algorithm>
#include <iostream>
#include <vector>
#include <memory>

using namespace std;

class Nodo {
public:
    bool getInfo(void) const { return info; }  // Retorns the content of info
    Nodo* getNext(void) const { return next; } // Retorns the cotent of next

    Nodo(bool i, Nodo* n) : info(i), next(n) {}

private:
    bool info;
    Nodo* next;
};

class Lista {
    Nodo* primero;
    int longitud;
public:
    int ConvierteBinarioDecimal(void) const;
    Lista(Nodo* p, int l) : primero(p), longitud(l) {}
};

static int ConvierteBinarioDecimal(Nodo const* node, int decimal = 0) {
    if (node == NULL) // prefer C++11 nullptr
        return decimal;
    decimal *= 2;
    if (node->getInfo())
        decimal++;
    return ConvierteBinarioDecimal(node->getNext(), decimal);
}

int Lista::ConvierteBinarioDecimal(void) const {
    return ::ConvierteBinarioDecimal(primero);
}

int main(int argc, char* argv[]) {
    Lista list(new Nodo(true, new Nodo(false, new Nodo(true, new Nodo(true, NULL)))), 4);
    std::cout << list.ConvierteBinarioDecimal() << std::endl;
    return 0;
}