Jump to content
joaosporting

Função recursiva em c++

Recommended Posts

joaosporting

Boas pessoal  :)

Foi-me pedido que faça uma função recursiva que permita devolver o numero de digitos de um numero.

Por exemplo, se o número for 274584, a função deverá devolver o número 6.

Podem-me ajudar, por favor?

Obrigado.

Share this post


Link to post
Share on other sites
thoga31

Onde queres ajuda?

Não esperes código feito, desde já. :)

É no código em si, ou no "significado" de Recursividade?


Knowledge is free!

Share this post


Link to post
Share on other sites
joaosporting

É no código, penso que terei de ir fazendo a divisao do número por 10 mas não sei como aplicar isso. Só queria mesmo esse pedaço de código se não fosse pedir muito.

Se não der, obrigado na mesma :)

Share this post


Link to post
Share on other sites
thoga31

Neste fórum, pedir um código é pedir muito. Nós podemos ajudar, mas tens de apresentar trabalho em concreto. Não pode ser "toma lá". Entendes?

Sabes o princípio da Recursividade ou nem por isso?

Ou a dúvida é no algoritmo em si?

Uma ideia:


Função QtsAlgarismos(Por Valor numero Inteiro)

  Se (numero Pertence A [0, 9]) Então Retorna 1

  SeNão Retorna 1 + QtsAlgarismos(numero DIV 10)

Fim Função



Knowledge is free!

Share this post


Link to post
Share on other sites
joaosporting

Consegui fazer, obrigado :)

int ContaDigitos(int n){
    if (n<=10)
         return 1;
    else
        return (ContaDigitos(n/10)+1);
}

Share this post


Link to post
Share on other sites
thoga31

Tens uma falha na condição de paragem. E a chamada recursiva poderá dar barraca por estares a passar um número fraccionário e não inteiro.


Knowledge is free!

Share this post


Link to post
Share on other sites
KTachyon

if (n < 10)

Ou será que o número 10 só tem um dígito? :)


“There are two ways of constructing a software design: One way is to make it so simple that there are obviously no deficiencies, and the other way is to make it so complicated that there are no obvious deficiencies. The first method is far more difficult.”

-- Tony Hoare

Share this post


Link to post
Share on other sites
thoga31

if (n < 10)

Ou será que o número 10 só tem um dígito? :)

Era para ele descobrir com base no pseudo-código que lhe dei... :)


Knowledge is free!

Share this post


Link to post
Share on other sites
Rui Carlos

E a chamada recursiva poderá dar barraca por estares a passar um número fraccionário e não inteiro.

Tanto quanto me lembro, será aplicada a divisão inteira, logo o valor não será fraccionário.

Share this post


Link to post
Share on other sites
thoga31

Tanto quanto me lembro, será aplicada a divisão inteira, logo o valor não será fraccionário.

O código dele dá a divisão dita normal. ;)

int ContaDigitos(int n){
    if (n<=10)
         return 1;
    else
        return (ContaDigitos(n/10)+1);
}


Knowledge is free!

Share this post


Link to post
Share on other sites
thoga31

Mas em C++  int / int = int? Não há um operador específico para dar int?

Normalmente existem operadores como \ ou div... ;)

(sim, não sei C++, mas aqui podia ajudar no algoritmo, daí a minha participação... ;))


Knowledge is free!

Share this post


Link to post
Share on other sites
pedrosorio

Mas em C++  int / int = int? Não há um operador específico para dar int?

Normalmente existem operadores como \ ou div... ;)

(sim, não sei C++, mas aqui podia ajudar no algoritmo, daí a minha participação... ;))

Não. Divisão entre inteiros é a divisão inteira em C/C++


Não respondo a dúvidas por mensagem.

Share this post


Link to post
Share on other sites
KTachyon

De facto, se quiseres obter um float, tens que fazer o cast a um deles ;)


“There are two ways of constructing a software design: One way is to make it so simple that there are obviously no deficiencies, and the other way is to make it so complicated that there are no obvious deficiencies. The first method is far more difficult.”

-- Tony Hoare

Share this post


Link to post
Share on other sites
thoga31

De facto, se quiseres obter um float, tens que fazer o cast a um deles ;)

É por estas e por outras que C e C++ nunca me atraíram... :D

Em Pascal, int / int = real, tal como na matemática. :P

(já chega de off-topic ;))


Knowledge is free!

Share this post


Link to post
Share on other sites
Rui Carlos

Em Pascal, int / int = real, tal como na matemática. ;)

Na Matemática normalmente não distingues um inteiro de um real, e assumes que estás a trabalhar com reais.

Mas quando se trabalha com álgebras de inteiros, é normal a divisão ser a divisão inteira (até porque reais não inteiros são coisas desconhecidas).

Share this post


Link to post
Share on other sites
thoga31

Na Matemática normalmente não distingues um inteiro de um real, e assumes que estás a trabalhar com reais.

Mas quando se trabalha com álgebras de inteiros, é normal a divisão ser a divisão inteira (até porque reais não inteiros são coisas desconhecidas).

Álgebra é algo com o qual não estou familiarizado. Os inteiros pertencem aos números reais, logo pode-se dizer que dividir dois inteiros retorna um real, que poderá ser um caso especial em que esse real seja também inteiro.

  • 9 / 2 = 4,5  »  real(int) / real(int) = real
  • 9 / 3 = 3    »  real(int) / real(int) = real(int)

;)


Knowledge is free!

Share this post


Link to post
Share on other sites
pedrosorio
Em 7/1/2011 às 21:53, thoga31 disse:

Álgebra é algo com o qual não estou familiarizado. Os inteiros pertencem aos números reais, logo pode-se dizer que dividir dois inteiros retorna um real, que poderá ser um caso especial em que esse real seja também inteiro.

  • 9 / 2 = 4,5  »  real(int) / real(int) = real
  • 9 / 3 = 3    »  real(int) / real(int) = real(int)

Estás perfeitamente correcto. Por isso é que em C é possível converter para "real" (ou a representação aproximada de números reais que são os floats) como tu fazes:

x = 9/(float)2
x fica com o valor 4.5

Caso não explicites que estás a usar números reais são inteiros e operações entre inteiros, devolvem inteiros como é natural. Podes dizer que inteiros pertencem aos reais (isto é qualquer inteiro pode ser representado como um real), mas se estás a tratá-los exclusivamente como inteiros (conjunto Z) as operações entre eles estão naturalmente no mesmo conjunto (Z) que não é (R).


Não respondo a dúvidas por mensagem.

Share this post


Link to post
Share on other sites
KTachyon

É por estas e por outras que C e C++ nunca me atraíram... :P

Em Pascal, int / int = real, tal como na matemática. ;)

(já chega de off-topic ;))

Pah, podes fazer:

float x;
x = 9.0/2;

E assim não precisas de fazer o cast.

Ao nível do computador existe uma distinção entre teres um inteiro e teres um float, são representados de forma diferente em memória mas ocupam exactamente o mesmo espaço. Ou seja, ambos podem ser lidos como int ou como float se quiseres, os valores é que vão ser completamente diferentes.

As "outras linguagens" que falas acabam por fazer o processo de conversão por ti, criando espaços em memória necessários para efectuar a transição para outra representação. Nem sempre quer dizer que é melhor usares uma linguagem que faça "tudo" por ti. Podes ganhar velocidade de implementação, mas perdes optimização e flexibilidade.


“There are two ways of constructing a software design: One way is to make it so simple that there are obviously no deficiencies, and the other way is to make it so complicated that there are no obvious deficiencies. The first method is far more difficult.”

-- Tony Hoare

Share this post


Link to post
Share on other sites
thoga31

Não sei porquê, houve algo neste teu último post que me está a fazer "imbicar" para aprender C++ (e não C, não sei porquê mas cheira-me mais o C++... lol) ;)

</off-topic> ;)


Knowledge is free!

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.