Ir ao conteúdo
  • Cadastre-se
RomuloS

Transformar inteiro em binario usando recursividade

Recommended Posts

Estou tentando desenvolver uma função recursiva para transformar um inteiro em numero binário e colocando o resultado em um vector usando a seguinte lógica:

A cada chamada da função, divido o numero por 2, se o resto for igual a 0, insiro um 0 no vector, se não, coloco 1 no vector.

Logo em seguida quando a função termina,eu mostro o conteúdo do vector.

porém, nada é mostrado na tela.

Por quê?


#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <string>
#include <vector>
using namespace std;

void itob(short n,vector<int> binary);

int main()
{

short n;
vector <int> binary;
cin>>n;
itob(n, binary);
for(int i = 0; i < binary.size(); i++)
{
cout<<binary.at(i)<<" ";
}

return 0;
}
void itob(short n,vector<int> binary)
{
if(n > 0 )
{
if(n % 2 == 0)
{
binary.push_back(1);
}
else
{
binary.push_back(0);
}
}
itob(n-1,binary);
}

Compartilhar este post


Link para o post
Compartilhar em outros sites

RomuloS,

Estou tentando desenvolver uma função recursiva para transformar um inteiro em numero binário e colocando o resultado em um vector usando a seguinte lógica:

A cada chamada da função, divido o numero por 2, se o resto for igual a 0, insiro um 0 no vector, se não, coloco 1 no vector.

Logo em seguida quando a função termina,eu mostro o conteúdo do vector.

porém, nada é mostrado na tela.

Por quê?

Faltou passar o vetor como referência e também ajustar corretamente o argumento passado à função recursiva; a cada chamada, você precisa estar dividindo por 2, e não decrementando em 1:

#include <iostream>
#include <vector>
using namespace std;

void itob(short n, vector<int> &bin);

int main()
{
short n;
vector <int> binary;

cin>>n;

itob(n, binary);

for(size_t i = 0; i < binary.size(); i++)
{
cout<<binary.at(i)<<" ";
}

return 0;
}

void itob(short n, vector<int> &bin)
{
int d = n;

if (n > 1)
{
d = n % 2;
itob(n / 2, bin);
}

bin.push_back(d);
}

Um abraço, ;)

[]'s

LNW

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

Cara valeu.
Mas tem varias coisas q eu não entendi
Por que quando eu passo o vector por parâmetro ele já não passa a referencia como se fosse um array?
Por que o flag é n > 1 e não n > 0?
E por que a variável inteira d?
Por que a variável inteira não pega o resto da divisão?
tipo 7/2 da 3,5 ele deveria receber o 5 não 1;
sempre quando da resto ele recebe 1? se não tem resto recebe 0?
porque?

porque do meu jeito ta errado?

if(n % 2 == 0){binary.push_back(1);}else{binary.push_back(0);}}

Compartilhar este post


Link para o post
Compartilhar em outros sites
Estou tentando desenvolver uma função recursiva para transformar um inteiro em numero binário e colocando o resultado em um vector usando a seguinte lógica:

A cada chamada da função, divido o numero por 2, se o resto for igual a 0, insiro um 0 no vector, se não, coloco 1 no vector.

Logo em seguida quando a função termina,eu mostro o conteúdo do vector.

porém, nada é mostrado na tela.

Por quê?

#include <iostream>#include <cstdio> //DESNECESSÁRIO#include <cstdlib> //DESNECESSÁRIO#include <string> //DESNECESSÁRIO#include <vector>using namespace std;void itob(short n,vector<int> binary); //DEVE SER POR REFERENCIAint main(){short n;vector <int> binary;cin>>n;itob(n, binary);//AQUI você PRECISA INVERTER O VECTOR POIS BINÁRIO A LEITURA é DA DIREITA PARA ESQUERDAfor(int i = 0; i < binary.size(); i++){cout<<binary.at(i)<<" ";}return 0;}void itob(short n,vector<int> binary) //DEVE SER POR REFERENCIA{if(n > 0 ){if(n % 2 == 0) //AQUI, tá ERRADO, porque você COLOCA 0 SE O RESTO FOR ==0 E não O INVERSO{binary.push_back(1);}else{binary.push_back(0);}}itob(n-1,binary); //ESTE CARA DEVE ESTAR DENTRO DO IF n>0 SENÃO NUNCA VAI PARAR}

Olá, citei algumas coisa q vi erradas no teu código e vou colocar o meu aí você testa e vê se ajuda.

#include <iostream>#include <algorithm>#include <vector>using namespace std;void itob(short n,vector<int> &binary);int main(){short n;vector <int> binary;cin>>n;itob(n, binary);if(binary.size() < 8){ //AQUI PREENCHE PARA COMPLETAR UM BYTEwhile(binary.size() < 8)binary.push_back(0);}reverse(binary.begin(),binary.end()); //INVERTE, POIS A LEITURA BINARIA é INVERSA DA DECIMALfor(int i = 0; i < binary.size(); i++){cout<<binary.at(i)<<" ";}return 0;}void itob(short n,vector<int> &binary){if(n == 1){binary.push_back(1);return;}if(n > 0 ){if(n % 2 == 0){binary.push_back(0);}else{binary.push_back(1);}itob(n/2,binary);}return;}
  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

Cara não deu de entende varias coisas no teu códico.

Essa parte eu não entendi:


if(binary.size() < 8) //AQUI PREENCHE PARA COMPLETAR UM BYTE
{
while(binary.size() < 8)
binary.push_back(0);
}

Ele mostra no resultado mais 0 do que devia.

E o motivo de eu ter trocado;quando o resto for 0 colocar 1 e quando der resto diferente de 0 colocar 0,

é justamente pra não ter que inverter o vector entendeu?

Compartilhar este post


Link para o post
Compartilhar em outros sites

RomuloS,

Por que quando eu passo o vector por parâmetro ele já não passa a referencia como se fosse um array?

Exatamente por std::vector não ser um C array (que sempre 'decai' a ponteiro ao ser passado como argumento de uma função). vectors, por outro lado, podem ser passados tanto por referência quanto por valor (o que você usou).

Por que o flag é n > 1 e não n > 0?

Se o valor decimal passado for 0 ou 1, não é necessário fazer nenhuma divisão sucessiva, então, eu já armazeno diretamente no vetor.

E por que a variável inteira d?

Para ir guardando os dígitos (0 ou 1) a cada chamada da função. A cada chamada à função, as variáveis locais e dos parâmetros da função são empilhadas e vão estar disponíveis novamente ao sair da recursão.

É importante frisar que para entender recursão, é fundamental estar familiarizado com o conceito de estrutura de pilhas.

Por que a variável inteira não pega o resto da divisão?

tipo 7/2 da 3,5 ele deveria receber o 5 não 1;

sempre quando da resto ele recebe 1? se não tem resto recebe 0?

porque?

O operador (%) retorna o resto de uma divisão Euclidiana:

http://en.wikipedia.org/wiki/Euclidean_division

porque do meu jeito ta errado?

if(n % 2 == 0)

{

binary.push_back(1);

}

else

{

binary.push_back(0);

}

}

Nem é questão de estar errado, o problema é que a função acabou sendo tecnicamente recursiva*, mas a solução pensada continua sendo iterativa (não recursiva).

* e isso é comum de acontecer, principalmente quando começa-se a lançar mão de variáveis estáticas ou o emprego de muitos parâmetros na função; provavelmente tem algo que ainda possa ser melhorado em casos assim...

[]'s

LNW

Compartilhar este post


Link para o post
Compartilhar em outros sites

A questão do preenchimento com zeros, foi como expliquei, é para ficar mais claro não tem sentido você usar bits "avulsos" já q a cada 8 bits temos 1 byte, o comum é sempre representarmos,independente se existe só 1 bit, com 8 bits tipo: 00000001 == 1
01000000 = 64
Segue código sem inverter, montando na recursão.

#include <iostream>#include <algorithm>#include <vector>using namespace std;void itob(short n,vector<int> &binary);int main(){short n;vector <int> binary;cin>>n;itob(n, binary);if(binary.size() < 8){ //AQUI, SE não QUISER REPRESENTAR UM BYTE, é só COMENTAR ESTE TRECHOwhile(binary.size() < 8)binary.insert(binary.begin(),0);}//reverse(binary.begin(),binary.end());for(int i = 0; i < binary.size(); i++){cout<<binary.at(i)<<" ";}return 0;}void itob(short n,vector<int> &binary){if(n == 1){binary.push_back(1);return;}if(n > 0 ){if(n % 2 == 0){itob(n/2,binary);binary.push_back(0);}else{itob(n/2,binary);binary.push_back(1);}}return;}
  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

LNW,

O operador (%) retorna o resto de uma divisão Euclidiana

Cara foi difícil entender essa parada de divisão euclidiana,mas eu entendi.

Como a divisão é por 2 então o resto vai ser no máximo 1 certo?

Se fosse um numero maior que 2 já não ia dar, certo?

e isso é comum de acontecer, principalmente quando começa-se a lançar mão de variáveis estáticas ou o emprego de muitos parâmetros na função; provavelmente tem algo que ainda possa ser melhorado em casos assim...

Mas o seu códico ta usando a recursividade corretamente?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisar ser um membro para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora





Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas publicações sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×