Ir ao conteúdo

C Função recursiva em C


Ir à solução Resolvido por arfneto,

Posts recomendados

Postado

Boa tarde, pessoal!

Estou realizando uma atividade cujo objetivo é usar uma função recursiva para realizar uma divisão inteira apenas através de subtrações sucessivas.

Fiz um laço usando while e somente ele (que rodei em um código a parte) deu certo. O problema está em usá-lo na função recursiva. Consegui fazê-lo compilar, mas o resultado não está correto.

Olhando o código ainda não encontrei o problema (pensei que fosse o return i na função, mas o resultado não foi alterado, ou talvez na declaração das variáveis - mas ainda não sei dizer)... Se eu uso o return divide(a, b) no final da função, o resultado ainda permanece o mesmo de antes... Também percebi que na maior parte das vezes o valor de i acaba sendo igual ao valor de b (não sei se ele acabou fazendo o cálculo errado ou se deu algum conflito entre as variáveis).

 

Comecei a aprender funções recursivas há pouco tempo, caso alguém possa ajudar, agradeço muito a ajuda!

 

 

Laço que dá certo sozinho:

#include <stdio.h>

int main (){

int a, b, i = 0;

printf ("Digite o dividendo (numero que será dividido):");

scanf ("%d", &a);

printf ("Digite o divisor:");

scanf ("%d", &b);



while (a > 0 && a >= b){

a = a - b; i++;

}



printf ("O resultado da divisao e: %d", i);



return 0;

}

 

 

 

Função recursiva que dá errado:

 

#include <stdio.h>



int main (){

int a,b;



printf ("Digite o dividendo (numero que será dividido): ");

scanf ("%d", &a);

printf ("Digite o divisor: ");

scanf ("%d", &b);



printf ("O resultado da divisao e: %d. \n", divide(a,b));



return 0;



}



int divide (a,b){

int i = 0;



while (a > 0 && a >= b){

a = a - b; i++;



return i;



}

}

 

 

 

Postado

@LuanaNasc Oii, uma funçao recursiva é uma funcao que dentro dela ela chama ela mesma, voce nao esta chamando a divide dentro dela mesma. voce teria que trocar esse while pro um if else, e caso ele precise subtrair ainda ele vai chamar ele mesmo (funcao divide) caso nao precise mas ela vai retornar i. Tenta colocar esse i como parâmetro da funcao tambem, se nao toda vez que chamar ela o i vai ser 0

 

1 hora atrás, LuanaNasc disse:

Boa tarde, pessoal!

Estou realizando uma atividade cujo objetivo é usar uma função recursiva para realizar uma divisão inteira apenas através de subtrações sucessivas.

Fiz um laço usando while e somente ele (que rodei em um código a parte) deu certo. O problema está em usá-lo na função recursiva. Consegui fazê-lo compilar, mas o resultado não está correto.

Olhando o código ainda não encontrei o problema (pensei que fosse o return i na função, mas o resultado não foi alterado, ou talvez na declaração das variáveis - mas ainda não sei dizer)... Se eu uso o return divide(a, b) no final da função, o resultado ainda permanece o mesmo de antes... Também percebi que na maior parte das vezes o valor de i acaba sendo igual ao valor de b (não sei se ele acabou fazendo o cálculo errado ou se deu algum conflito entre as variáveis).

 

Comecei a aprender funções recursivas há pouco tempo, caso alguém possa ajudar, agradeço muito a ajuda!

 

 

Laço que dá certo sozinho:




#include <stdio.h>

int main (){

int a, b, i = 0;

printf ("Digite o dividendo (numero que será dividido):");

scanf ("%d", &a);

printf ("Digite o divisor:");

scanf ("%d", &b);



while (a > 0 && a >= b){

a = a - b; i++;

}



printf ("O resultado da divisao e: %d", i);



return 0;

}

 

 

 

Função recursiva que dá errado:

 




#include <stdio.h>



int main (){

int a,b;



printf ("Digite o dividendo (numero que será dividido): ");

scanf ("%d", &a);

printf ("Digite o divisor: ");

scanf ("%d", &b);



printf ("O resultado da divisao e: %d. \n", divide(a,b));



return 0;



}



int divide (a,b){

int i = 0;



while (a > 0 && a >= b){

a = a - b; i++;



return i;



}

}

 

 

 

 

  • Obrigado 1
Postado

@LuanaNasc A cada "iteração" o parâmetro dividendo, "quanto a função chama a si", é o atual dividendo menos o divisor.

Há chamadas recursivas somente se a decisão para chamada é verdadeira.

 

A decisão para chamar é uma expressão lógica que avlia SE o dividendo é maior ou igual ao divisor.

Outra maneira de escrever e conseguir o mesmo resutado é: SE o divisor é menor, ou igual ao dividendo. 

 

Tem muitas formas, em C, de escrever esse programa.

Se precisar de mais, pergunte.

 

Valeu.

  • Obrigado 1
  • Solução
Postado

Recursão é um loop. Considere o simples. Ao invés do seu loop while você, a cada vez que o dividendo for maior que o divisor você soma um no quociente e divide o resto, como no papel. Só isso. 

Ex: 5/2:

  • É claro que o quociente inicialmente é zero.
  • 5 é maior que 2 então o quociente fica 1 e divide (5 - 2) por 2
  • 3 é maior que 2 então o quociente fica 2 e divide (3 - 2) por 2
  • 1 é menor 1ue 2 então acabou a divisão: o resultado é 2, popularmente chamado de quociente e o que sobrou, popularmente chamado de resto, é 1.
  • Em C fica igualzinho
  • Obrigado 1

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

LANÇAMENTO!

eletronica2025-popup.jpg


CLIQUE AQUI E BAIXE AGORA MESMO!