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