EEL170 COMPUTAÇÃO I 5a série de slides Versão 30/08/2016 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) // procedimento N – justificar(texto) // procedimento (Espaços distribuidos entre palavras e nenhum no final) B – buscarPalavra(palavra, texto) // * n vezes função S – substituirPalavra(palavra, palavraNova, texto) // * procedimento I – incluirPalavra(palavra, texto, posição) // procedimento E – excluirPalavra (palavra, texto) // procedimento F – finalizar Obs.: nunca ultrapassar os limites do texto e sempre passar parâmetros, nunca usar globais