Ir ao conteúdo
  • Cadastre-se

Transformar inteiro em binario usando recursividade


RomuloS

Posts recomendados

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

Link para o comentário
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
Link para o comentário
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);}}
Link para o comentário
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
Link para o comentário
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?

Link para o comentário
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

Link para o comentário
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
Link para o comentário
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?

Link para o comentário
Compartilhar em outros sites

  • 7 anos depois...

Crie uma conta ou entre para comentar

Você precisa ser um usuário 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 comunidades 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

×
×
  • Criar novo...