Jump to content

[Resolvido] Digitos de um número


askazy
 Share

Recommended Posts

Boa noite, bom o objetivo do programar é criar uma função recursiva, a qual dado um numero inteiro n entre 1 e 9999999 imprima os dígitos do mesmo na ordem em que ele aparece, exemplos

Exemplo 1: n= 123456

saída: 1 2 3 4 5 6

Exemplo2: n=32123

saída: 3 2 1 2 3

Não estou conseguindo enxergar uma forma de resolver isso usando recursão, se fosse do último ao primeiro dígito eu até saberia, mas começando do primeiro, não sei o que fazer.

Link to comment
Share on other sites

O que se faz classicamente é obter o dígito e escrevê-lo logo no monitor. Só após escrevermos o dígito é que voltamos a chamar a função de forma recursiva.

O segredo está essencialmente em trocar esta ordem. Assim o que acontece é que a função recursiva é chamada, e quando chegas ao último dígito começa a ser feito o printf de trás para a frente.

Um pedaço de papel e caneta vão-te ajudar a perceber este efeito.

Edited by thoga31

Knowledge is free!

Link to comment
Share on other sites

Se sabes fazer em ordem inversa, também sabes fazer em ordem correta. Como o thoga31 apontou, é só trocar a ordem das operações. De uma forma geral, a ordem das operações em funções recursivas dita o funcionamento de um algoritmo.

Edited by nhm
Link to comment
Share on other sites

Acho que consegui, meio que na sorte mas acho que deu:

#include <stdio.h>
void digitos(int n){
if (n>10){
 digitos(n/10);
 digitos(n%10);
}
else{
 printf ("%d ",n);
}
}
int main(){
 int n;
 scanf ("%d",&n);
 digitos(n);
return 0;
}

Só que não consegui muito bem ver o funcionamento.

Edited by askazy
Link to comment
Share on other sites

Essa solução funciona, mas faz mais chamadas recursivas do que é necessário. Repara que n%10 produz sempre um valor entre 0 e 9, logo essa chamada vai sempre para o "else".

Se substituires essa chamada por simplesmente um printf, reduzes em muito o número de chamadas e fica mais legível.

void digitos(int n){
 if(n > 0){
	  digitos(n/10);
	  printf("%d ", n%10);
 }
}

Para te ajudar a perceberes o funcionamento do algoritmo, vamos analisar o caso de digitos(123).

Esta é a ordem de operações (as | servem para identificares a chamada a que o código pertence).

digitos(123)

| digitos(12) (123/10)

| | digitos(1) (12/10)

| | | digitos(0) - como n <= 0, não faz nada

| | print(1) (1%10)

| print(2) (12%10)

print(3) (123%10)

Edited by nhm
  • Vote 1
Link to comment
Share on other sites

Para quê chamar a função duas vezes? Já reparaste que a segunda chamada, digitos(n%10), é redundante? n%10 é sempre menor que 10, pelo que é uma forma complicada de fazer o printf - chamas a função, n é menos que 10, e faz printf, voltando à função inicial.

void digs(long n) {
  if (n>=10)
     digs(n/10);
  printf("%ld ", n%10);
}

Como funciona? Tu tens o número 1234, por exemplo. 1234>=10, pelo que vai chamar a função digs. 1234/10 = 123, ou seja, estamos a invocar digs(123). E assim em diante, até que chamamos digs(1). Como 1<10, a condição do if não se cumpre, e paramos a chamada recursiva. Faz o printf de 1%10 que é 1, e volta à função que a chamou inicialmente. Esta era a função digs(12) e é feito o printf respectivo.

Em esquema:

digs(1234)
----> 1234 >= 10? Sim, logo:
  |> digs(1234/10) = digs(123)
  |
  |  ----> 123 >= 10? Sim, logo:
  |     |> digs(123/10) = digs(12)
  |     |
  |     |  ----> 12 >= 10? Sim, logo:
  |     |     |> digs(12/10) = digs(1)
  |     |     |
  |     |     |  ----> 1 >= 10? Não, logo:
  |     |     |     |> printf(1%10 = 1)
  |     |     |     |
  |     |     |  <---- [volta à função que fez a chamada]
  |     |     |> printf(12%10 = 2)
  |     |     |
  |     |  <----
  |     |> printf(123%10 = 3)
  |     |
  |  <----
  |> printf(1234%10 = 4)
  |
[Fim]
Edited by thoga31

Knowledge is free!

Link to comment
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
 Share

×
×
  • 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.