Você está na página 1de 37

Recurso

Fac. Cincias Univ. Lisboa

Luis Antunes Algoritmos e Estruturas de Dados

Hoje
!

Excepes.

Algoritmos recursivos, pilha de execuo e registos de


activao.

Busca binria num array.

Algumas operaes sobre listas.

! As torres de Hanoi.

Luis Antunes Algoritmos e Estruturas de Dados

Fac. Cincias
Univ. Lisboa

Recurso
Fac. Cincias Univ. Lisboa

Luis Antunes Algoritmos e Estruturas de Dados

Definio
! Um problema recursivo quando pode ser decomposto

numa ou mais verses mais simples de si prprio.


! Um problema recursivo quando pode ser
!
!
!

decomposto
numa ou mais verses
mais simples

! de si prprio.

Luis Antunes Algoritmos e Estruturas de Dados

Fac. Cincias
Univ. Lisboa

Exemplo n = 1 + (n1)
!

Limpar uma pilha de pratos:


! Se s tem um prato, limp-lo
!

Caso contrrio:
!
!

Limpar o primeiro
Limpar o resto da pilha

Luis Antunes Algoritmos e Estruturas de Dados

Fac. Cincias
Univ. Lisboa

Exemplo n = 2 x (n/2)
! Para procurar um elemento alvo num array ordenado

(ordem crescente) de n elementos:


!

Se o array est vazio


!

Devolver 1 como resultado da procura (no encontrado)

Caso contrrio
! Se o elemento central do array igual ao alvo, devolver o
!

ndice do elemento central como resultado


Caso contrrio

! Se o alvo menor que o elemento central


! Procurar recursivamente nos elementos antes do central e
!

devolver o resultado
Caso contrrio procurar recursivamente nos elementos depois
do central e devolver o resultado

Luis Antunes Algoritmos e Estruturas de Dados

Fac. Cincias
Univ. Lisboa

Esquema geral
! Se o problema pode ser resolvido para o valor corrente

de n, resolv-lo
!

Caso contrrio
!
!

Caso base
Caso de
recurso

Recursivamente aplicar o algoritmo a um ou mais


problemas envolvendo valores menores de n
Combinar as solues dos problemas menores para
arranjar a soluo do problema original

Luis Antunes Algoritmos e Estruturas de Dados

Fac. Cincias
Univ. Lisboa

Passos de desenvolvimento
! Tem que haver um caso (caso base), para um valor

pequeno de n, que possa ser resolvido directamente


! Um problema de qualquer tamanho (seja n) pode ser

dividido em verses menores do mesmo problema


(caso recursivo)

Luis Antunes Algoritmos e Estruturas de Dados

Fac. Cincias
Univ. Lisboa

Construo da soluo
!

Reconhecer o caso base e arrnjar uma soluo para ele

Desenvolver uma estratgia para dividir o problema em


verses menores de si prpria. Cada caso recursivo tem
que assegurar progresso na direco do caso base

Combinar as solues dos problemas menores de


forma a que cada problema maior seja resolvido
correctamente

Luis Antunes Algoritmos e Estruturas de Dados

Fac. Cincias
Univ. Lisboa

Exemplo
!

Encontrar o comprimento de uma String


! Se a String est vazia o comprimento zero
!

Caso contrrio o comprimento 1 + o comprimento da String


que exclui o primeiro caracter

public static int length (String str) {


if (str == null || str.equals())
return 0;
else return 1+length(str.substring(1));
}"
mtodo
recursivo

Luis Antunes Algoritmos e Estruturas de Dados

Fac. Cincias
Univ. Lisboa

Outro exemplo
!

Imprimir uma String um caracter por linha

public static void printChars(String str) {


if (str == null || str.equals()) {
return;
} else {
System.out.println(str.charAt(0));
printChars(str.substring(1));
}
couve d
}"
"

chamada
recursiva

c
o
u
v
e

Luis Antunes Algoritmos e Estruturas de Dados

Fac. Cincias
Univ. Lisboa

Inverter a string
!

Antecipando a chamada recursiva

public static void printCharsReverse(String str) {


if (str == null || str.equals()) {
return;
} else {
printChars(str.substring(1));
System.out.println(str.charAt(0));
}
couve d
}"
"antes da
outra

e
v
u
o
c

Luis Antunes Algoritmos e Estruturas de Dados

Fac. Cincias
Univ. Lisboa

Prova da correco
!

Prova por induo:


!
!

Provar o teorema para o caso base (n=0 ou n=1)


Mostrar que se for vlido para n tambm para n+1

! No nosso caso:
!
Verificar que o caso base reconhecido e resolvido
correctamente
!
Verificar que cada caso recursivo progride em direco ao caso
base
!
Veificar que se os problemas menores forem resolvidos
correctamente ento o problema original tambm resolvido
directamente

Luis Antunes Algoritmos e Estruturas de Dados

Fac. Cincias
Univ. Lisboa

Trao de execuo
! O trao mostra a sequncia de chamadas e retornos

public static int length (String str) {


if (str == null || str.equals())
return 0;
else return 1+length(str.substring(1));
Luis Antunes Algoritmos e Estruturas de Dados
}"

Fac. Cincias
Univ. Lisboa

Pilha de execuo
! A pilha de execuo contm activation frames

Luis Antunes Algoritmos e Estruturas de Dados

Fac. Cincias
Univ. Lisboa

Combinando os dois

valores de
retorno

Luis Antunes Algoritmos e Estruturas de Dados

Fac. Cincias
Univ. Lisboa

Algoritmos recursivos

Luis Antunes Algoritmos e Estruturas de Dados

Fac. Cincias
Univ. Lisboa

Busca linear num array


!

Algoritmo para busca recursiva linear:


! Se o array est vazio
! O resultado 1

Caso contrrio
! Se o primeiro elemento igual ao alvo
! O resultado o ndice desse elemento

Caso contrrio
!

Procurar no array que exclui o primeiro elemento

Luis Antunes Algoritmos e Estruturas de Dados

Fac. Cincias
Univ. Lisboa

O Mtodo java

Luis Antunes Algoritmos e Estruturas de Dados

Fac. Cincias
Univ. Lisboa

Busca binria (s com arrays


ordenados)
! Se o array est vazio
!
Devolver 1 como resultado da procura (no encontrado)
!

Caso contrrio
!
!

Se o elemento central do array igual ao alvo, devolver o


ndice do elemento central como resultado
Caso contrrio
! Se o alvo menor que o elemento central
! Procurar recursivamente nos elementos antes do central e
devolver o resultado
!

Caso contrrio procurar recursivamente nos elementos


depois do central e devolver o resultado

Luis Antunes Algoritmos e Estruturas de Dados

Fac. Cincias
Univ. Lisboa

Busca binria em java

Luis Antunes Algoritmos e Estruturas de Dados

Fac. Cincias
Univ. Lisboa

Eficincia destes algoritmos


!

Busca linear: no pior caso procuramos em todo o array,


logo:
! O(n)

Busca binria: em cada chamada recursiva eliminamos


metade do array, logo:
! O(log n)

! MAS reparem que o array tem que estar ordenado, e a

ordenao CARA.
!

Ento, qual a vantagem?


Luis Antunes Algoritmos e Estruturas de Dados

Fac. Cincias
Univ. Lisboa

Mtodos para listas ligadas


! As listas ligadas so estruturas de dados eminentemente

recursivas

! Logo natural que sejam lidadas por mtodos recursivos


!

Que facilitam o trabalho porque seguem naturalmente a


definio da estrutura, relembremos

public class LinkedList<E>{


private Node<E> head;
private static class Node<E> {
private E data;
private Node next;
..."
Luis Antunes Algoritmos e Estruturas de Dados

Fac. Cincias
Univ. Lisboa

mtodo size()

Luis Antunes Algoritmos e Estruturas de Dados

Fac. Cincias
Univ. Lisboa

toString()

Luis Antunes Algoritmos e Estruturas de Dados

Fac. Cincias
Univ. Lisboa

replace()

Luis Antunes Algoritmos e Estruturas de Dados

Fac. Cincias
Univ. Lisboa

add(E data)

Luis Antunes Algoritmos e Estruturas de Dados

Fac. Cincias
Univ. Lisboa

remove(E outData)

Luis Antunes Algoritmos e Estruturas de Dados

Fac. Cincias
Univ. Lisboa

remove(E outData)

Luis Antunes Algoritmos e Estruturas de Dados

Fac. Cincias
Univ. Lisboa

insertBefore(E target, E inData)


antes
head

not-target1

not-target2

target

not-target3

inData

inData

head
not-target1

not-target2

target

Luis Antunes Algoritmos e Estruturas de Dados

not-target3
Fac. Cincias
Univ. Lisboa

Torres de Hani
!

Regras:
! um disco no pode ser colocado sobre um disco menor

Luis Antunes Algoritmos e Estruturas de Dados

Fac. Cincias
Univ. Lisboa

Anlise
! Inputs:
!
Nmero de discos a mover
!
!
!

Pino de origem
Pino de destino
Pino temporrio

! Outputs:
! Uma String com a sequncia de movimentos

Luis Antunes Algoritmos e Estruturas de Dados

Fac. Cincias
Univ. Lisboa

Design: soluo para 3 discos

Luis Antunes Algoritmos e Estruturas de Dados

Fac. Cincias
Univ. Lisboa

Design: soluo para 2 discos

Luis Antunes Algoritmos e Estruturas de Dados

Fac. Cincias
Univ. Lisboa

Design: soluo para 4 discos

Luis Antunes Algoritmos e Estruturas de Dados

Fac. Cincias
Univ. Lisboa

Soluo para n discos


! Se n=1
! Mover o disco 1 (menor) da origem para o destino
!

Caso contrrio
! Mover os n1 discos do topo da origem para o

temporrio
! Mover o disco n da origem para o destino
! Mover os n1 discos do topo do temporrio para o

destino

Luis Antunes Algoritmos e Estruturas de Dados

Fac. Cincias
Univ. Lisboa

Em java

Luis Antunes Algoritmos e Estruturas de Dados

Fac. Cincias
Univ. Lisboa

Você também pode gostar