EEL170 COMPUTAÇÃO I
5a série de slides
Versão 09/10/2015
Recursão
Recursão


A recursão é um mecanismo em que o que está sendo definido
pode utilizar-se dele próprio
Há áreas em que isto não é permitido


Exemplo: Um objeto leve é algo que tem a propriedade de
ser leve
Na Matemática pode-se definir funções recursivas

Exemplo: 4! = 4*3*2*1

Ou: 4! = 4*3! e 3! = 3*2! e 2! = 2*1! e 1! = 1

Pode-se então definir o fatorial de forma recursiva:



se n = 0 então n! é 1
senão n! = n*(n-1)!
Aplica-se a função recursivamente até que n seja 0
Exemplo de fatorial em algoritmo

(* Cuidado: a função cresce rapidamente – o
resultado de 8! é maior que 40.000, portanto
não é contido em uma variável inteira de dois
bytes *)
Função fatorial (x:inteiro):inteiro
(* função para calcular o fatorial de um número
recursivamente; responsável: ...; data: …*)
Inicio
Se x = 0 então
Fatorial ← 1
Senão
Fatorial ← x*(x-1)!
fim
Cadeias de caracteres
Problema: Saber se uma palavra ou um texto é
um palíndromo
O palíndromo pode ser lido da esquerda para a
direita ou ao contrário
Exemplo: Assim a aia ia à missa.
Para resolver o problema teremos de acessar os
caracteres de uma palavra ou de um texto
O literal (string) é na realidade uma matriz linear
de caracteres, o que permite acessar um
caractere em qualquer posição do literal
Essa propriedade não impede que o literal seja
tratado também como uma variável simples
Voltando ao problema: Saber se uma palavra ou
um texto é um palíndromo
Solução do problema:
- Fazer um algoritmo que:
- Permita que o usuário digite um texto
- Teste se o texto é um palíndromo
- verificar se o texto lido em um sentido é igual ao
texto lido no sentido contrário
- Informe o resultado ao usuário
Algoritmo palíndromo
(* algoritmo para verificar se um texto é palíndromo; autor: ...; data: ... *)
var
resultado: booleano // para exemplificar o uso de booleano
inicio
leia (texto) // orientar e validar
comprimento  length(texto) // função para literal
indice  1
resultado  verdadeiro
enquanto (indice <= comprimento div 2) e (resultado) faça
inicio
se texto(indice) <> texto (comprimento – indice + 1) então
resultado  falso
fim
indice  indice +1
fim
se resultado então
escreva(“O texto: “,texto,”é palíndromo”)
senão escreva(“O texto: “,texto,”não é palíndromo”)
fim
Funções e procedimentos para
literais
•
•
•
•
•
•
•
•
•
•
Funções
Concat (S1, S2, ...)
Copy (S, I, N)
Length (S)
Pos (S1, S)
Procedimentos
delete (S, I, N)
insert (S1 , S, I)
Str (V, S)
Val (S, V, I)
•
•
•
•
Significados
S, S1: literal
I, N: inteiro
V: inteiro ou real
Problema
Fazer um pequeno editor para uma frase até 80 caracteres.
Em uma iteração até que o usuário escolha sair, o usuário vê a frase como ela
está no momento, depois pode escolher uma das operações:
D – digitar(texto, comprimento)
N – normalizar(texto, comprimento)(Um espaço entre palavras e nenhum no final)
B – buscarPalavra(texto, posicao) // * n vezes
S – substituirPalavra(texto, comprimento) // *
I – incluirPalavra(texto, comprimento, posição)
E – excluirPalavra (texto, comprimento)
J – justificar(texto, comprimento)
F – finalizar
Obs.: nunca ultrapassar os limites do texto e sempre passar parâmetros
Download

Apresentação parte 5