MC600 - Segundo semestre de 1997 - LISTA 3 - Solucoes ----------------------------------------------------- 1. (defun permuta (lista) (if (null lista) '(()) (insere (car lista) (permuta (cdr lista))) ) ) (defun insere (elemento listas) (if (null listas) () (append (insere-lista elemento (car listas)) (insere elemento (cdr listas)) ) ) ) (defun insere-lista (elemento lista) (if (null lista) (list (list elemento)) (cons (cons elemento lista) (insere-frente (car lista) (insere-lista elemento (cdr lista)) ) ) ) ) (defun insere-frente (elemento listas) (if (null listas) () (cons (cons elemento (car listas)) (insere-frente elemento (cdr listas)) ) ) ) 2. (defun conta-ocorrencias (lista) (conta lista ()) ) (defun conta (lista parcial) (if (null lista) parcial (conta (cdr lista) (atualiza (car lista) parcial)) ) ) (defun atualiza (elem parcial) (cond ((null parcial) (list (list elem 1))) ((equal (caar parcial) elem) (cons (list elem (+ (cadar parcial) 1)) (cdr parcial))) (t (cons (car parcial) (atualiza elem (cdr parcial)))) ) ) 3. (defun sublista (listinha listona) (cond ((null listona) (null listinha)) ((equal (car listinha) (car listona)) (sublista (cdr listinha) (cdr listona)) ) (t (sublista listinha (cdr listona))) ) )