C++ 递归函数,用于从二进制文件列表中获取十进制数
如果我有一个包含N个表示二进制数的元素的列表,并且每个节点(我将其命名为info)都是布尔值(true=1,false=0),那么使用递归函数获取十进制值的最佳方法是什么 我尝试使用谷歌,但我只提供了十进制的公式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
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 Bydecimal
你的意思是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;
}