Next: About this document ...
MAC-IME-USP CARLOS EDUARDO FERREIRA
SALA 297A TEL.: 3818 6140
E-MAIL cef@ime.usp.br
MONITOR: MARCIO C. CABRAL
MAC 122 - Princ�pios de Desenvolvimento de Algoritmos
Segundo semestre de 2000
Lista de exerc�cios--Recurs�o
``Para fazer uma fun��o recursiva
� preciso ter f�.''
Siang Wun Song
- Fa�a uma fun��o recursiva MaxMin que calcula o elemento m�ximo e o
elemento m�nimo de um vetor com
n�meros inteiros.
- Quantas compara��es (em fun��o de
) envolvendo elementos do vetor o
seu algoritmo faz?
- Fa�a uma fun��o recursiva D�gito que recebe um n�mero inteiro
e
calcula a soma dos digitos de
. Exemplo: se
ent�o D�gito
.
- Fa�a uma fun��o recursiva que verifica se uma express�o de
par�nteses � bem formada.
- Idem para uma express�o com par�nteses, colchetes (`[',`]') e chaves
(`{',`}').
- Considere a fun��o abaixo:
double f(double x, double y)
{
if (x >= y)
return ((x+y)/2);
return (f(f(x+2, y-1), f(x+1, y-2));
}
Qual � o valor de
? Como se poderia calcular
de maneira mais
simples?
- A fun��o de Akermann � definida da seguinte maneira:
Escreva uma fun��o recursiva que recebe inteiros n�o negativos
e
e
devolve
.
- Simule a execu��o do programa abaixo:
#include <stdio.h>
int fusc(int n)
{
if (n <= 1) return (1);
if (n % 2 == 0)
return( fusc(n / 2) );
return( fusc((n-1)/2) + fusc((n+1)/2) );
}
int main()
{
int m = 7;
printf("Fusc = %d\n", fusc(m));
}
- Considere a seguinte fun��o:
void misterio (int A[], int inic, int fim)
{
int aux;
while (A[fim] % 2 == 0 && inic < fim)
fim --;
while (A[inic] % 2 == 1 && inic < fim)
inic++;
if (inic < fim){
aux = A[inic];
A[inic] = A[fim];
A[fim] = aux;
misterio(A, inic, fim);
}
}
- Simule a fun��o Mist�rio para
 |
 |
 |
 |
 |
 |
 |
 |
 |
|
 |
8 |
10 |
3 |
6 |
5 |
2 |
9 |
1 |
4 |
Inicio e Fim . |
- O que faz a fun��o Mist�rio? Quantas compara��es envolvendo elementos
do vetor
s�o feitas? Escreva um algoritmo que faz a mesma coisa com um
n�mero menor de compara��es.
- Simule a seguinte fun��o recursiva para
:
int zzz(int n)
{
int aux;
if (n <= 2)
return(1);
n--;
aux = zzz(n);
n--;
return (aux + zzz(n));
}
- Escreva uma fun��o recursiva Tab
que recebe como par�metro um
inteiro n�o negativo
e calucula um par de inteiros
, onde
e
s�o as coordenadas de
na tabela abaixo:
 |
 |
 |
 |
 |
 |
 |
0 |
0 |
2 |
5 |
9 |
14 |
|
|
1 |
1 |
4 |
8 |
13 |
|
|
|
2 |
3 |
7 |
12 |
|
|
|
|
3 |
6 |
11 |
|
|
|
|
|
4 |
10 |
|
|
|
|
|
|
... |
|
|
|
|
|
|
|
 |
|
|
|
|
|
|
 |
- Suponha que temos de calcular o produto de matrizes
onde cada
� uma matriz com
linhas e
colunas. (Portanto,
descrevem as dimens�es das matrizes.) Suponha ainda que o
produto de qualquer par de matrizes ser� calculado pelo algoritmo usual; assim
o produto de uma matriz
por uma matriz
requer
opera��es de multiplica��o entre n�meros. A ordem em que
a multiplica��o de tr�s ou mais matrizes � executada pode afetar
sensivelmente o n�mero total de multiplica��es. Por exemplo, se
e
ent�o o c�lculo da express�o
requer 125000 multiplica��es enquanto que
o c�lculo da express�o
requer 2200
multiplica��es. Seja
o n�mero m�nimo de multiplica��es necess�rias
para calcular
. Temos que
Escreva uma fun��o recursiva que recebe
e a seq��ncia
e calcula
.
- Escreva uma fun��o que dado
imprime todas as permuta��es
dos n�meros inteiros
. Escreva duas vers�es,
uma iterativa e uma recursiva. (Sugest�o: O conjunto das
permuta��es dos inteiros
pode ser obtida atrav�s
do conjunto das permuta��es dos inteiros de
inserindo-se
em cada poss�vel posi��o de cada permuta��o.)
- Escreva uma fun��o que dados dois inteiros positivos
e
imprima
todas as combina��es de
em grupos de tamanho
. Escreva duas
vers�es, uma iterativa e outra recursiva.
- Escreva um programa para imprimir em ordem lexicogr�fica todos os subconjuntos
do conjunto
. Para
o resultado deve ser:
- A fun��o abaixo calcula o maior divisor comum dos inteiros positivos
e
. Escreva uma fun��o recursiva equivalente.
int Euclides (int m, int n)
{
int r;
do{
r = m % n;
m = n;
n = r;
}
while (r != 0);
return(m);
}
Next: About this document ...
Carlos Eduardo Ferreira
2000-10-02