O que há de Novo?
Fórum Outer Space - O maior fórum de games do Brasil

Registre uma conta gratuita hoje para se tornar um membro! Uma vez conectado, você poderá participar neste site adicionando seus próprios tópicos e postagens, além de se conectar com outros membros por meio de sua própria caixa de entrada privada!

  • Anunciando os planos GOLD no Fórum Outer Space
    Visitante, agora você pode ajudar o Fórum Outer Space e receber alguns recursos exclusivos, incluindo navegação sem anúncios e dois temas exclusivos. Veja os detalhes aqui.


DEIXA CAIR

Liljhou

Bam-bam-bam
Mensagens
1.715
Reações
3.639
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

Lenda da internet
Mensagens
41.721
Reações
94.262
Pontos
2.179
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.715
Reações
3.639
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
132
Reações
233
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.715
Reações
3.639
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.020
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

Ei mãe, 500 pontos!
Mensagens
1.394
Reações
1.086
Pontos
608
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.715
Reações
3.639
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

Lenda da internet
Mensagens
41.721
Reações
94.262
Pontos
2.179
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
132
Reações
233
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

Mil pontos, LOL!
VIP
Mensagens
13.049
Reações
16.062
Pontos
1.053
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.715
Reações
3.639
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.127
Reações
7.351
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
GOLD
Mensagens
25.335
Reações
9.417
Pontos
1.804
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.913
Reações
3.179
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
 

Rayzen_X

Ei mãe, 500 pontos!
Mensagens
3.144
Reações
3.830
Pontos
704
Sim, isso é C.
Eu olho logo se usa printf ao invés de cout. hehe
 

Ruano Roxo

Ei mãe, 500 pontos!
Mensagens
1.881
Reações
598
Pontos
844
É 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
GOLD
Mensagens
25.335
Reações
9.417
Pontos
1.804
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

Mil pontos, LOL!
VIP
Mensagens
13.049
Reações
16.062
Pontos
1.053
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
GOLD
Mensagens
25.335
Reações
9.417
Pontos
1.804
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

Mil pontos, LOL!
VIP
Mensagens
13.049
Reações
16.062
Pontos
1.053
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
GOLD
Mensagens
25.335
Reações
9.417
Pontos
1.804
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.715
Reações
3.639
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 Fundo