You are on page 1of 5

Recursividade - Resoluo dos Exerccios

Primeira Lista (Slide 46)


1) Faa 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) Faa o teste de mesa do procedimento abaixo e informe qual ser a sada 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 funo 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 sero feitas na avaliao acima?
3
4) Escreva uma funo recursiva para calcular o somatrio dos N primeiros nmeros inteiros
positivos.
int somatorio(int n)
{
int soma;
if (n==0)
return 0;
return soma = n + somatorio(n-1);
}
5) Escreva uma funo recursiva que recebe como parmetros um nmero 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 funo recursiva para determinar o nmero de dgitos de um nmero 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 funo recursiva para calcular o N-simo nmero da sequncia de Fibonacci. A
sequncia 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 funes recursivas para calcular:
a) o elemento mximo de S;
b) a soma dos elementos de S;
c) mdia aritmtica 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 funo recursiva que imprima na tela os nmeros mpares de 1 um nmero fornecido
pelo usurio.
#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 funo recursiva, ImprimeSerie (i, j, k), que imprime na tela a srie de valores do
intervalo [i,j], com incremento k (i, j e k so 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;
}

You might also like