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

Recursividade

Ello B. Guedes
elloa.ifpb@gmail.com http://sites.google.com/site/elloaguedes

Exerccios
Projete um algoritmo que soma dois nmeros de forma recursiva
int soma(int a, int b)

Caso base 1 + 1 = 2

Ello B. Guedes

Exerccios
Calcular o mximo divisor comum de x e y recursivamente

Ello B. Guedes

Exerccios
Somatrio dos elementos de 1 at n

Soma dos elementos de um array

Encontrar o menor elemento em um array

Ello B. Guedes

Exerccios
Faa uma funo recursiva que calcule o valor da srie S descrita a seguir para um valor n>0 a ser fornecido como parmetro para a
S = 1 + 1/1! + 1/2! + 1/3! + 1 /n!

Ello B. Guedes

Demonstrao
Fractal Curves

Ello B. Guedes

Aplicaes em Estruturas de Dados


possvel utilizar recursividade em diversas estruturas de dados
Filas Pilhas rvores, etc.

Ello B. Guedes

Fila Simplesmente Encadeada


Apontador para o incio da fila
Enfileira Desenfileira Tamanho da fila Imprimir fila

Ello B. Guedes

Fila Simplesmente Encadeada


typedef struct stnodo { int dado; struct stnodo *prox; } nodo; typedef nodo* TFila;

Ello B. Guedes

Tamanho da Fila
int tamanhoFila(TFila p){ if (filaVazia(p) == xtrue) return 0; int contador = 0; while (p != NULL){ contador++; p = p->prox; } return contador; }

Ello B. Guedes

Tamanho da Fila
Observar este trecho com ateno
while (p != NULL){ contador++; p = p->prox; }

Se o prximo no NULL
Incrementa contador Repete o processo para o prximo elemento Idia para implementar uma soluo recursiva!

Ello B. Guedes

Tamanho da Fila Recursivo


int tamanhoFilaRecursivo(nodo* no){ if (no == NULL) return 0; else return (1 + tamanhoFilaRecursivo(no->prox)); }

Ello B. Guedes

Enfileira Trecho de Cdigo


if ((tamanhoFila(*p)) == 0) { *p = aux; } else { while (itera->prox != NULL){ itera = itera->prox; } itera->prox = aux; }

Ello B. Guedes

Enfileira
Enquanto o atual->prox for diferente de NULL
Caminha para o atual->prox->prox Repete o procedimento Possibilidade de soluo recursiva

Situao a ser considerada


Fila Vazia

Ello B. Guedes

Enfileira Recursivo
void enfileiraRecursivo(nodo* no, nodo* novo){ if (no == NULL) no = novo; else if (no->prox == NULL) { no->prox = novo; } else { enfileiraRecursivo(no->prox,novo); } }
Ello B. Guedes

Imprimir Fila Recursivo


Analogia com o tamanho da fila
Ao invs de somar a cada nodo encontrado, deve imprimir o dado do nodo.

Ello B. Guedes

Imprimir Fila Recursivo


Alterao na chamada da funo
Impresso dos delimitadores [ e ] deve ser feita separadamente

printf("\n["); imprimeFilaRecursivo(fila); printf("]\n");

Ello B. Guedes

Imprimir Fila Recursivo


void imprimeFilaRecursivo(nodo* no){ if (no == NULL); else { printf(" %d ",no->dado); imprimeFilaRecursivo(no->prox); } }

Ello B. Guedes

Pilha Encadeada
Apontador para o topo da pilha
Empilha Desempilha Tamanho da pilha Impresso da pilha

Ello B. Guedes

Pilha Encadeada
/* Definicao dos nodos da pilha */

typedef struct stnop { int dado; struct stnop *prox; } nopilha; typedef nopilha* TPilha;

Ello B. Guedes

Imprimir Pilha
Imprime topo
Segue para topo->prox Repete o procedimento Lgica para uma implementao recursiva

Ello B. Guedes

Imprimir Pilha Recursivo


nopilha* aux; aux = *p; printf("\n ["); imprimeRecursivo(aux); printf("]\n");

Ello B. Guedes

Imprimir Pilha Recursivo


void imprimeRecursivo(nopilha *aux){

if (aux == NULL) {} else { printf(" %d ", aux->dado); imprimeRecursivo(aux->prox); }

Ello B. Guedes

Algoritmos Recursivos para Pilhas


Calcular tamanho da pilha Encontrar e imprimir a base da pilha

Ello B. Guedes

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