Buscar

10-Recursividade

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você viu 3, do total de 5 páginas

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Prévia do material em texto

Recursividade - Resolução dos Exercícios 
Primeira Lista (Slide 46) 
1) Faça um procedimento recursivo que receba dois valores inteiros a e b e imprima o intervalo 
fechado entre eles. Se a for maior que b mostrar mensagem de erro. 
void intervalo(int a, int b) 
{ 
if (a > b) 
printf("Erro: primeiro numero maior que o segundo"); 
 else 
{ 
 if(a==b) 
printf("%d",a); 
 else 
 { 
 printf("%d",a); 
 intervalo(a+1,b); 
 } 
} 
} 
2) Faça o teste de mesa do procedimento abaixo e informe qual será a saída do mesmo se a chamada 
for faz( 1, 4 ). 
Na primeira passada a recebera 1 e b 4; 
Entrara no else ( if dara falso ja que 1 nao e maior que 4); 
a == b e falso entao entra no outro else; 
Imprime 1 e chama novamente o procedimento; 
Agora na segunda passada a recebe 2 e b continua 4; 
Entrara no else ( if dara falso ja que 1 nao e maior que 4); 
a == b e falso entao entra no outro else; 
Imprime 2 e chama novamente o procedimento; 
Na terceira passada a recebe 3 e b continua 4; 
Entrara no else ( if dara falso ja que 3 nao e maior que 4); 
a == b e falso entao entra no outro else; 
Imprime 3 e chama novamente o procedimento; 
Na quarta passada a recebe 4 e b continua 4; 
Entrara no else ( if dara falso ja que 4 nao e maior que 4); 
a == b e verdadeiro entao entra if e imprime 4; 
No final imprimiu 1234 , que era o resultado esperado; 
3) Dada a função X: 
int X (int n, int m) 
{ 
if ((n<=m) || (m==0) || (n==0)) 
return 1; 
return X(n-1,m)+X(n-1,m+1); 
} 
a) Qual o valor de X(5,3) ? 
5 
b) Quantas chamadas serão feitas na avaliação acima? 
3 
 
4) Escreva uma função recursiva para calcular o somatório dos N primeiros números inteiros 
positivos. 
int somatorio(int n) 
{ 
 int soma; 
 if (n==0) 
return 0; 
 return soma = n + somatorio(n-1); 
} 
5) Escreva uma função recursiva que recebe como parâmetros um número real X e um inteiro N e 
retorna o valor de XN Obs.: N pode ser negativo . 
float eleva(float x,int n) 
{ 
 if (n<0){ 
 return 1/eleva(x,-n); 
 } 
 else 
if (n==1) 
return x; 
 return x*eleva(x,n-1); 
} 
6) Escreva uma função recursiva para determinar o número de dígitos de um número N inteiro. 
int digitos(int n) 
{ 
 int result; 
 if (n/10==0) 
return 1; 
 return result = 1 + digitos(n/10); 
} 
 
Segunda lista(Slide 50) 
1)Escreva uma função recursiva para calcular o N-ésimo número da sequência de Fibonacci. A 
sequência é dada por: 
 
#include <stdio.h> 
#include <stdlib.h> 
int F(int n) 
{ 
 if(n == 0) 
 return 0; 
 else if(n == 1) 
 return 1; 
 else 
 return(F(n-1) + F(n-2)); 
} 
int main() 
{ 
 int num; 
 printf("Digite o valor de n: "); 
 scanf("%d", &num); 
 if(num < 0) 
 printf("\nValor de n eh invalido!\n"); 
 else 
 printf("\nTermo de numero %d da sequencia de Fibonnacci eh: %d\n", num, F(num)); 
 return 0; 
} 
2) Seja S um vetor de inteiros. Descreva funções recursivas para calcular: 
a) o elemento máximo de S; 
b) a soma dos elementos de S; 
c) média aritmética dos elementos de S. 
#include <stdio.h> 
#include <stdlib.h> 
int maior_elemento(int S[], int tam) 
{ 
 int maior; 
 if(tam == 1) 
 return (S[0]); 
 else 
 { 
 maior = maior_elemento(S, (tam - 1)); 
 if(maior > S[tam - 1]) 
 return maior; 
 else 
 return (S[tam - 1]); 
 } 
} 
 
int soma_elementos(int S[], int tam) 
{ 
 int soma; 
 if(tam == 1) 
 return S[0]; 
 else 
 { 
 soma = S[tam - 1] + soma_elementos(S, (tam - 1)); 
 return soma; 
 } 
} 
float media_elementos(int S[], int tam) 
{ 
 float media; 
 media = soma_elementos(S, tam) / tam; 
 return media; 
} 
int main() 
{ 
 int i, S[5]; 
 for(i = 0; i < 5; i++) 
 { 
 printf("S[%d] = ", i); 
 scanf("%d", &S[i]); 
 } 
 printf("\nO maior elemento de S eh: %d", maior_elemento(S, 5)); 
 printf("\nA soma dos elementos de S eh: %d", soma_elementos(S, 5)); 
 printf("\nA media aritmetica dos elementos de S eh: %.2f\n", media_elementos(S, 5)); 
 return 0; 
} 
3)Escreva uma função recursiva que imprima na tela os números ímpares de 1 à um número fornecido 
pelo usuário. 
#include <stdio.h> 
#include <stdlib.h> 
void imprime_impar(int n) 
{ 
 if(n == 1) 
 printf("%d ", n); 
 else 
 { 
 if(n % 2 == 0) 
 imprime_impar(n-1); 
 else 
 { 
 imprime_impar(n-2); 
 printf("%d ", n); 
 } 
 } 
} 
int main() 
{ 
 int num; 
 printf("Digite o valor de n: "); 
 scanf("%d", &num); 
 imprime_impar(num); 
 return 0; 
} 
 
4) Escreva uma função recursiva, ImprimeSerie (i, j, k), que imprime na tela a série de valores do 
intervalo [i,j], com incremento k (i, j e k são inteiros). 
#include <stdio.h> 
#include <stdlib.h> 
void imprime_serie(int i, int j, int k) 
{ 
 if(i <= j) 
 { 
 printf("%d ", i); 
 imprime_serie((i + k), j, k); 
 } 
} 
int main() 
{ 
 int i, j, k, aux; 
 printf("Digite dois numeros que definem o intervalo: "); 
 scanf("%d %d", &i, &j); 
 if(i > j) 
 { 
 aux = i; 
 i = j; 
 j = aux; 
 } 
 printf("Digite o incremento do intervalo: "); 
 scanf("%d", &k); 
 imprime_serie(i, j, k); 
 return 0; 
}

Outros materiais