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