Вы находитесь на странице: 1из 3

Lista 1

Considere o problema de encontrar o valor de maior montante dentre aqueles


contidos em um vetor. desejvel criar um algoritmo recursivo para encontrar
esse valor mximo do vetor. Mas para isso vamos ver o algoritmo iterativo
abaixo.
max = vetor[0];
for(i=1;1<10;1++){
if(max<vetor[i])
max=vetor[i];
}
Repare que a cada fim de iterao do lao, temos certeza de que max estar o
maior elemento do vetor entre as posies 0 e i. Esse o invariante do lao.
Agora, lembrando sobre essa certeza, como que podemos imaginar um
algoritmo recursivo. Relembrando, para criar um algoritmo recursivo
necessrio reduzir a instncia do problema em uma instncia menor.
No caso de um vetor de 10 elementos onde preciso encontrar o maior
elemento, qual uma instncia menor do problema? um vetor de 9
elementos onde preciso encontrar o maior elemento. Ou seja, comparo o maior
elemento do vetor de 9 elementos com a ltima posio do vetor. E a instancia
menor de um elemento de um vetor de 9 posies um vetor de 8 posies, e
assim por diante.
Relembrando novamente, para criar um algoritmo recursivo necessrio em
algum momento para de reduzir o problema a instancias menores, afim de
evitar entra em chamadas recursivas indefinidamente. Neste caso qual ser o
critrio de parada? Qual a menor quantidade de elementos de um vetor para
que possamos encontrar um valor mximo dentre seus elementos? Um.
Quando houve apenas um elemento no vetor, o maior elemento deste vetor
ser esse nico elemento. Portanto teremos como critrio de parada quando o
vetor possuir apenas um elemento.
i=9;
int maximo(int * vetor, int i){
if(i=0)
return vetor[0];
else
return (vetor[i]>maximo(vetor[i-1]))?vetor[i]:maximo(vetor[i1];
}

Exerccios
1) Identifique um algoritmo recursivo para:
a) Encontrar a soma de um vetor.
b) Calcular o n-simo numero de uma PG(progresso geomtrica) dada
uma entrada qualquer de um elemento inicial e uma razo.
c) Encontrar recursivamente a potncia m de um numero n.(ou seja n m)
2) Identifique o critrio de parada de cada um dos itens anteriores
3) Qual o valor de X (4)?
int X (int n) {
if (n == 1 || n == 2) return n;
else return X (n-1) + n * X (n-2);
}
4) Qual o valor de f (1,10)? Escreva uma funo equivalente que seja mais
simples.
double f (double x, double y) {
if (x >= y) return (x + y)/2;
else return f (f (x+2, y-1), f (x+1, y-2));
}
5) Qual o resultado da execuo do programa abaixo?
int ff (int n) {
if (n == 1) return 1;
if (n % 2 == 0) return ff (n/2);
return ff ((n-1)/2) + ff ((n+1)/2);
}
int main (void) {
printf ("%d", ff(7));
return EXIT_SUCCESS;
}
6) Execute fusc (7,0).
int fusc (int n, int profund) {
int i;
for (i = 0; i < profund; ++i)
printf (" ");
printf ("fusc(%d,%d)\n", n, profund);
if (n = 1)
return 1;
if (n % 2 == 0)
return fusc (n/2, profund+1);
return fusc ((n-1)/2, profund+1) + fusc ((n+1)/2, profund+1);

}
7) A funo de Fibonacci definida assim: F(0) = 0, F(1) = 1 e F(n) = F(n1) + F(n-2) para n > 1. Descreva a funo F em linguagem C. Faa uma
verso iterativa e uma recursiva.
8) Seja F a verso recursiva da funo de Fibonacci. O clculo do valor da
expresso F(3) provocar a seguinte sequncia de invocaes da funo:
F(3)
F(2)
F(1)
F(0)
F(1)
Qual a sequncia de invocaes da funo provocada por F(5)?
9) A seguinte funo calcula o maior divisor comum dos inteiros estritamente
positivos m e n. Escreva uma funo recursiva equivalente.
int Euclides (int m, int n) {
int r;
do {
r = m % n;
m = n;
n = r;
} while (r != 0);
return m;
}

Вам также может понравиться