递归函数从二进制文件列表中获取十进制数

时间:2014-07-21 20:28:06

标签: c++ recursion

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

我尝试使用谷歌,但我只附带十进制公式;

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(节点)类。

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

private:
    bool info;
    Nodo *next;
};

class Lista{
    Nodo *primero;
    int longitud;
};

我上周开始学习C ++,到目前为止它比Java更加艰难> _<所以任何帮助都是天赐之物。

3 个答案:

答案 0 :(得分:1)

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
    }
}

我希望西班牙语也有帮助! :)

答案 1 :(得分:1)

这是一个递归的例子:

我必须做一些小改动,将 const 添加到 getInfo (这里没有问题)并将 const 添加到 getNext (你可能也需要和非const版本),问题是函数ConvierteBinarioDecimal被声明为const这是好的(不必为了计算而改变任何东西)十进制表示,但这个力,两个方法需要const)你可以根据需要添加非const版本。

static 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;
}

答案 2 :(得分:-1)

执行此操作的最快方法之一是使用位移操作。所以,例如:

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;
}

基本上,我在这里所做的就是一睹目光。请注意我如何遍历链表。通过在以下迭代中检查current->next,我在current为空时停止。我还跟踪我正在处理的位。对于每个位,如果该位为1,我将其放入临时变量并使用<<运算符将其移至正确位置。然后我使用OR运算符(OR和赋值)|=这个临时变量和运行总计。

现在,以递归方式执行此操作:

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();
}