O que há de Novo?
  • Novo tema VIP está disponível
    Visitante, um novo tema com fundo escuro agora está disponível para aqueles que contribuíram com doações ao fórum e têm o status VIP. Veja os detalhes aqui.


DEIXA CAIR

Liljhou

Bam-bam-bam
Mensagens
1.760
Reações
3.663
Pontos
304
Olha esse código:

#include <stdio.h>

int main(void){

int n;

int soma(int n);

printf("digite os numeros que serao somados\n");
scanf("%d",&n);

printf("o resultado eh: %d",soma(n));
}

int soma(int n){
//modulo para verificar se não tem resto, numeros quebrados
if (n % 10 == n)
return n;
return ((n % 10) + soma(n / 10));
}

Ele tem uma função recursiva, alguém sabe me explicar como que funciona essa função? linha por linha dela? o código soma todos os numeros que vc digita, por exemplo se digitar 1 5 6 ele informa 12.
 


dk120

Ei mãe, 500 pontos!
Mensagens
33.749
Reações
62.847
Pontos
979
Sempre que voce pega o resto da divisão por 10, é equivalente a pegar o ultimo digito do numero. Tipo 64 % 10 = 4, ou seja, 4 é o ultimo digito.

Sempre que voce divide por 10 com inteiros é o equivalente a perder a ultima casa. Exemplo, 125 / 10 = 12.

Combinado as duas manhas, voce consegue somar os digitos. (n % 10) pega o primeiro digito soma, como a chamada recursiva dividindo por 10 soma(n / 10)), ou seja, repete pulando o digito ja somado.

PS.: Que péssimo modo de ensinar recursidade. Tem dezenas de problemas mais intuitivos para se resolver como recursividade. Esse ai é muito mais facil com um for.
 

Liljhou

Bam-bam-bam
Mensagens
1.760
Reações
3.663
Pontos
304
Sempre que voce pega o resto da divisão por 10, é equivalente a pegar o ultimo digito do numero. Tipo 64 % 10 = 4, ou seja, 4 é o ultimo digito.

Sempre que voce divide por 10 com inteiros é o equivalente a perder a ultima casa. Exemplo, 125 / 10 = 12.

Combinado as duas manhas, voce consegue somar os digitos. (n % 10) pega o primeiro digito soma, como a chamada recursiva dividindo por 10 soma(n / 10)), ou seja, repete pulando o digito ja somado.

PS.: Que péssimo modo de ensinar recursidade. Tem dezenas de problemas mais intuitivos para se resolver como recursividade. Esse ai é muito mais facil com um for.
Sim sim é muito mais fácil usando um simples for eu inclusive fiz muito de boas, só botar um vetor e botar o for pra percorrer ele e somar todo o vetor, mas fzer oq né kkk
 

GearsX

Habitué da casa
Mensagens
135
Reações
234
Pontos
58
Falam que toda criança deve aprender programação, pelo amor de deus nope querer infartar o moleque logo cedo
 


Liljhou

Bam-bam-bam
Mensagens
1.760
Reações
3.663
Pontos
304
Falam que toda criança deve aprender programação, pelo amor de deus nope querer infartar o moleque logo cedo
Programação é um mundo aberto diante sua frente, e a lógica da programação é uma só. Aprendeu a lógica da programação, vc aprendeu programar, só fica um pouco chato pegar as subjetividades de cada linguagem, mas isso ai vc pega na prática, experiência, ou seja, programando.
 

Grombrindal

Supra-sumo
Mensagens
503
Reações
1.010
Pontos
183
Aproveitando o tópico de recursividade, quando isso vale a pena de fazer ao inves usar um loop do tipo while?
 

Macaco Louco

Bam-bam-bam
Mensagens
1.378
Reações
1.052
Pontos
208
Aproveitando o tópico de recursividade, quando isso vale a pena de fazer ao inves usar um loop do tipo while?
Em problemas naturalmente recursivos. Por exemplo, um algoritmo para desenhar fractais, para calcular séries, ordenação de valores e em alguns problemas de otimização. Existem vários problemas deste tipo.

Enviado de meu XT1097 usando Tapatalk
 

Liljhou

Bam-bam-bam
Mensagens
1.760
Reações
3.663
Pontos
304
Em problemas naturalmente recursivos. Por exemplo, um algoritmo para desenhar fractais, para calcular séries, ordenação de valores e em alguns problemas de otimização. Existem vários problemas deste tipo.

Enviado de meu XT1097 usando Tapatalk
ordenação de valores se não em engano é possível fazer utilizando somente o for
 

dk120

Ei mãe, 500 pontos!
Mensagens
33.749
Reações
62.847
Pontos
979
Depende a prioridade. Geralmente a solução recursiva é mais custosa, visto que invocar função costuma ser caro em qualquer linguagem.

Agora se a prioridade é fácil entendimento, o que é o caso na maioria dos projetos normais, vai depender do problema. Esse do OP, por exemplo, embora a solução apresentada tenha uma beleza matemática, assusta. Um for percorrendo os digitos e somando será muito melhor aceito pela maioria. Mas tem problemas como o famoso fatorial que a solução recursiva é mais amigável.
 

GearsX

Habitué da casa
Mensagens
135
Reações
234
Pontos
58
Programação é um mundo aberto diante sua frente, e a lógica da programação é uma só. Aprendeu a lógica da programação, vc aprendeu programar, só fica um pouco chato pegar as subjetividades de cada linguagem, mas isso ai vc pega na prática, experiência, ou seja, programando.
Passa 2/3 arrumando bug do que desenvolvendo, importa mais decorar códigos ou souber procurar na net e rezar para não da error.

Eu fazendo uma vídeo aula com Angular e Slim e não consigo ficar 10 min direto programando que sempre da alguma treta e ai ter que pesquisar passa muito tempo, para no final resolver e aparecer outro em seguida.

Meu cunhado, q trabalhava com SAP e agora foi trabalhar em armazem no Canadá, disse que não existe programador mais de 40 anos kkkkkkk
 

SquallxD

Ei mãe, 500 pontos!
VIP
Mensagens
12.959
Reações
15.797
Pontos
553
Código:
#include <stdio.h>

int main(void)
{
    int n;
    int soma(int n);

    // le dos dados digitados pelo usuário
    printf("digite os numeros que serao somados\n");
    scanf("%d",&n);

    printf("o resultado eh: %d",soma(n));
}

int soma(int n)
{
    //modulo para verificar se não tem resto, numeros quebrados  
  
    /*
        1º passada
        Imagina que o cara digitou 15,
        aqui vai fazer na primeira vez o resto de 15/10, que vai ser igual a 5.
        5 não é igual a 15, vai pro else.
      
        2º passada
        O médodo soma será chamado passando como parâmetro o número 1.
        resto de 1 dividido por 10 é 1, ou seja, vai entrar no "return n" retornando 1.
    */
    if (n % 10 == n)
    {
        return n;
    }
    else
    {  
        /*
            1º chamada
            chegando aqui, ele vai retornar o módulo de 15/10, ou seja 5. E irá chamar o soma novamente passando 15/10, ou seja, 1,5.
            Porém, como o médodo soma recebe um numero inteiro, irá arredondar pra 1. (ver 2º passada) no comentário acima.
            Como explicado no tópico 2º passada, ele irá retornar um, dessa forma o retorno vai ser 5 + 1, totalizando 6, que é o resultado correto.

        */
        return ((n % 10) + soma(n / 10));
    }
}
Fiz correndo aqui no trabalho, espero que de pra entender, dei uma organizada no código também.
Mas assim, no mundo real eu nunca faria uma solução dessas pra um problema tão simples.
 

Liljhou

Bam-bam-bam
Mensagens
1.760
Reações
3.663
Pontos
304
Código:
#include <stdio.h>

int main(void)
{
    int n;
    int soma(int n);

    // le dos dados digitados pelo usuário
    printf("digite os numeros que serao somados\n");
    scanf("%d",&n);

    printf("o resultado eh: %d",soma(n));
}

int soma(int n)
{
    //modulo para verificar se não tem resto, numeros quebrados 
 
    /*
        1º passada
        Imagina que o cara digitou 15,
        aqui vai fazer na primeira vez o resto de 15/10, que vai ser igual a 5.
        5 não é igual a 15, vai pro else.
     
        2º passada
        O médodo soma será chamado passando como parâmetro o número 1.
        resto de 1 dividido por 10 é 1, ou seja, vai entrar no "return n" retornando 1.
    */
    if (n % 10 == n)
    {
        return n;
    }
    else
    { 
        /*
            1º chamada
            chegando aqui, ele vai retornar o módulo de 15/10, ou seja 5. E irá chamar o soma novamente passando 15/10, ou seja, 1,5.
            Porém, como o médodo soma recebe um numero inteiro, irá arredondar pra 1. (ver 2º passada) no comentário acima.
            Como explicado no tópico 2º passada, ele irá retornar um, dessa forma o retorno vai ser 5 + 1, totalizando 6, que é o resultado correto.

        */
        return ((n % 10) + soma(n / 10));
    }
}
Fiz correndo aqui no trabalho, espero que de pra entender, dei uma organizada no código também.
Mas assim, no mundo real eu nunca faria uma solução dessas pra um problema tão simples.
show de bola mano, mto obrigado tbm pela ajuda.
 
Mensagens
3.023
Reações
6.954
Pontos
303
Passa 2/3 arrumando bug do que desenvolvendo, importa mais decorar códigos ou souber procurar na net e rezar para não da error.

Eu fazendo uma vídeo aula com Angular e Slim e não consigo ficar 10 min direto programando que sempre da alguma treta e ai ter que pesquisar passa muito tempo, para no final resolver e aparecer outro em seguida.

Meu cunhado, q trabalhava com SAP e agora foi trabalhar em armazem no Canadá, disse que não existe programador mais de 40 anos kkkkkkk
porque a demanda por esses profissionais é muito recente e aqueles que adentraram na década de 80/90 muito provavelmente ocupam posições executivas/estratégicas.

você percebe que isso é um ÓTIMO sinal?
 

Zeorymer

Gomu Gomu no Mi
VIP
Mensagens
25.332
Reações
9.330
Pontos
504
Aproveitando o tópico de recursividade, quando isso vale a pena de fazer ao inves usar um loop do tipo while?
Varia, um bom lugar para fazer este tipo de coisa por exemplo é quando vc está efetuando algum calculo ou buscando produto em uma linha de produção e precisa dos comprados do produto fabricado, neste caso a melhor maneira é fazer uma rotina recursiva para percorrer a estrutura dos fabricados.

Tem vários casos em que é utilizado o recursivo, estes dias fiz uma rotina em que o sistema vai calculando recursivamente os produtos por ano até um período x, executando a mesma rotina de relatório, neste caso foi bom, pq, se alguém alterar alguma regra no relatório,minha rotina não precisa ser alterada as continuará fazendo.

Mais para enter recursividade um melhor modo de fazer para mim é percorrendo estrutura de um produto fabricado.

Enviado de meu Moto G (5S) Plus usando Tapatalk
 
Ultima Edição:

Gary Oak

Bam-bam-bam
Mensagens
1.939
Reações
3.186
Pontos
303
Haha eu trabalho a mais de 5 anos com C++, acho que tenho propriedade pra falar que isso não é C++. isso é C.:kbeca
 

Ruano Roxo

Supra-sumo
Mensagens
1.815
Reações
479
Pontos
164
É verdade, mas muitas faculdades, escolas, sites, livros... ensinam C++ usando bibliotecas e sintaxes do C
Sem nem ao menos indicar a compatibilidade entre os dois...

:kzonzo
 

Zeorymer

Gomu Gomu no Mi
VIP
Mensagens
25.332
Reações
9.330
Pontos
504
Não manjo muito, qual a diferença entre o c, c++ e o c#?

Enviado de meu Moto G (5S) Plus usando Tapatalk
 

SquallxD

Ei mãe, 500 pontos!
VIP
Mensagens
12.959
Reações
15.797
Pontos
553
Não manjo muito, qual a diferença entre o c, c++ e o c#?

Enviado de meu Moto G (5S) Plus usando Tapatalk
C não é orientado a objetos, c++ é.

C# já é totalmente diferente, é uma linguagem interpretada e orientada a objetos, criada pela Microsoft, é bem mais produtiva de trabalhar do que C e C++.
A menos que vc faça algo que precise de muita performance ou vá rodar em hardware embarcado, não tem motivos pra usar C ou C++.
 

Zeorymer

Gomu Gomu no Mi
VIP
Mensagens
25.332
Reações
9.330
Pontos
504
C não é orientado a objetos, c++ é.

C# já é totalmente diferente, é uma linguagem interpretada e orientada a objetos, criada pela Microsoft, é bem mais produtiva de trabalhar do que C e C++.
A menos que vc faça algo que precise de muita performance ou vá rodar em hardware embarcado, não tem motivos pra usar C ou C++.
Imaginei que a diferença do c e do c++ era o objeto, mais não tinha certeza. O c# é uma variação do c++? Só que melhorada.? A sim quando se quer desempenho como vc falou entendo que deve ser utilizado o c.

Enviado de meu Moto G (5S) Plus usando Tapatalk
 

SquallxD

Ei mãe, 500 pontos!
VIP
Mensagens
12.959
Reações
15.797
Pontos
553
Imaginei que a diferença do c e do c++ era o objeto, mais não tinha certeza. O c# é uma variação do c++? Só que melhorada.? A sim quando se quer desempenho como vc falou entendo que deve ser utilizado o c.

Enviado de meu Moto G (5S) Plus usando Tapatalk
C# é mais parecido com Java do que com C++.
Tem garbage collector e tal, não precisa ficar gerenciando memória na mão.
 

Zeorymer

Gomu Gomu no Mi
VIP
Mensagens
25.332
Reações
9.330
Pontos
504
C# é mais parecido com Java do que com C++.
Tem garbage collector e tal, não precisa ficar gerenciando memória na mão.
Bacana, manjei, não sabia a diferença entre os 3.

Tô querendo entrar no mundo do mobile, imagino de o c# seria a melhor opção para isso.

Enviado de meu Moto G (5S) Plus usando Tapatalk
 

Liljhou

Bam-bam-bam
Mensagens
1.760
Reações
3.663
Pontos
304
Mudando o título do tópico aqui. Minha dúvida ja foi sanada então não há mais motivos pra existência dele
 
Topo