Nome: ? | Matrícula: ?

Programação funcional

Recursão profunda

Até agora temos trabalhado com listas de átomos, usando recursão para processar seu conteúdo. Definimos como lista profunda uma lista que contém outras listas. Listas profundas podem ser pensadas como árvores. Exemplo:

(a ((b c)) (d (e (f))) g)
       (a ((b c)) (d (e (f))) g)
                 |
----------------------------------------
|         |              |             |
a      ((b c))      (d (e (f)))        g
          |              |
          |          ----------
          |          |        |
        (b c)        d     (e (f))
          |                   |
       ------             --------
       |    |             |      |
       b    c             e     (f)
                                 |
                                 f

Para explorar a árvore completamente, é preciso usar recursão profunda. O função usa recursão profunda quando chama a si própria recursivamente no car e no cdr da lista.

Implementação de recursão profunda em LISP

Para implementar funções com recursão profunda, devemos considerar as características da lista passada como parâmetro para a função. Considere a função (conta-prof x lista), que indica o número de ocorrências de x na lista lista, que pode ou não ser profunda.

Consideramos três casos:

IMPORTANTE!!!: Para checar se x é uma lista não-vazia, use (consp x) (retorna t somente se x for uma lista não-vazia).

Sua vez

Implemente a função (conta-prof x lista), que indica o número de ocorrências de x na lista lista, que pode ou não ser profunda.

function(str, info) { return multiEval(str, info); }

A resposta está abaixo.

Exemplo: conta-prof (resposta)

Implemente a função (conta-prof x lista), que indica o número de ocorrências de x na lista lista, que pode ou não ser profunda. (resposta abaixo)

function(str, info) { return multiEval(str, info); }

Exemplo: membro-prof

Implemente a função (membro-prof x lista), que indica se x aparece na expressão lista, que pode ou não ser profunda.

function(str, info) { return multiEval(str, info); }

Exemplo: membro-prof (resposta)

Implemente a função (membro-prof x lista), que indica se x aparece na expressão lista, que pode ou não ser profunda.

function(str, info) { return multiEval(str, info); }

Dica

Note que as duas funções de recursão profunda são muito parecidas. O que muda de uma pra outra:

Exemplo: subst

Crie uma função, (subst x y expr), que substitui as oorrências de x por y na expressão expr, usando recursão profunda.

Antes de implementar, responda: que função você vai usar para combinar os resultados das chamadas recursivas?

function(str, info) { return multiEval(str, info); }

Exemplo: subst (resposta)

Crie uma função, (subst x y expr), que substitui as ocorrências de x por y na expressão expr, usando recursão profunda.

function(str, info) { return multiEval(str, info); }

Exemplo: flatten

Crie uma função, (flatten lista), que “achata” a lista, isto é, retorna uma lista de átomos com a mesma sequência de átomos da lista profunda lista.

function(str, info) { return multiEval(str, info); }