Elementos de Programação (LEGI) Aula Teórica 9: Programação

Propaganda
Elementos de Programação (LEGI)
Aula Teórica 9: Programação Recursiva
António Ravara
Secção de Lógica e Computação, Departamento de Matemática
Instituto Superior Técnico
Notas baseadas na bibliografia básica da cadeira
Elementos de Programação (LEGI) Aula Teórica 9: Programação Recursiva – p.1
Conceitos básicos
Funções recursivas
São funções definidas
à custa de si mesmas
Exemplo: o factorial
1,
se n = 1
n! =
n(n − 1)!, se n > 1
recorrendo a funções recursivas
Exemplo: f (x) = −x!
à custa de outras funções que se definem à custa
destas (por recursão mútua)
Elementos de Programação (LEGI) Aula Teórica 9: Programação Recursiva – p.2
Recursão mútua
Cadeia circular de definições
Uma função é definida à custa de outra, que é definida à
custa de uma terceira, etc., chegando a uma função
definida à custa da primeira.
A cadeia tem tamanho maior ou igual a 2.
Exemplo:
1,
se x ≤ 0
f (x), se x ≤ 0
f (x) =
g(x) =
g(x), caso contrário
x!,
caso contrário
Elementos de Programação (LEGI) Aula Teórica 9: Programação Recursiva – p.3
Exemplos elementares
Factorial
fact = Function[n,
If[n == 1,1,n fact[n-1]]
]
Exemplo de execução
fact[3] -->
If[3 == 1,1,3 fact[3-1]] -->
3 fact[3-1] -->
3 If[2 == 1,1,2 fact[2-1]] -->
3 2 fact[2-1] -->
3 2 If[1 == 1,1,1 fact[1-1]] -->
3 2 1 --> 6
Elementos de Programação (LEGI) Aula Teórica 9: Programação Recursiva – p.4
Exemplos elementares
Factorial
Atenção à chamada da função com valores para os quais
não está definida
O que se obtém se se chamar fact[−2], fact[2.5] ou
fact[T RUE ]?
Nova versão do factorial
fact = Function[n,
If[!IntegerQ[n],"Argumento errado",
If[n <= 0,"Indeterminada",
If[n == 1,1,n fact[n-1]]
]
]
]
Elementos de Programação (LEGI) Aula Teórica 9: Programação Recursiva – p.5
Exemplos elementares
Tamanho de uma lista
compr = Function[l,
If[l == {},0,1+compr[Rest[l]]]
]
Exemplo de execução
compr[{1,2}] -->
If[{1,2} == {},0,1+compr[Rest[{1,2}]]] -->
1+compr[Rest[{1,2}]] -->
1+If[{2} == {},0,1+compr[Rest[{2}]]] -->
1+1+compr[Rest[{2}]] -->
1+1+If[{} == {},0,1+compr[Rest[{}]]] -->
1+1+0 --> 2
Elementos de Programação (LEGI) Aula Teórica 9: Programação Recursiva – p.6
Exemplos complementares
Soma os valores de uma lista
somalista = Function[l,
If[l == {},0,
First[l]+somalista[Rest[l]]]
]
Aplica o factorial aos valores de uma lista
factlista = Function[l,
If[l == {},{},
Prepend[factlista[Rest[l]],First[l]!]
]
Elementos de Programação (LEGI) Aula Teórica 9: Programação Recursiva – p.7
Definição recursiva
Definição por casos
As funções recursivas são usualmente definidas por casos
dá-se um valor concreto para a chamada da função
com um determinado valor (ou conjunto de valores) do
domínio
este é o chamado caso base, ou a base da recursão
para os restantes valores do domínio a função é
definida com uma chamada recursiva a ela mesma
este é o chamado passo da recursão
Elementos de Programação (LEGI) Aula Teórica 9: Programação Recursiva – p.8
Definição por casos
Funções “tı́picas”
sobre os naturais
a,
se x = 1
base
f (x) =
g(f (x − 1)), caso contrário passo
sobre as listas
f (l) =
a,
se l = {}
base
g(f (resto(l))), caso contrário passo
Elementos de Programação (LEGI) Aula Teórica 9: Programação Recursiva – p.9
Download