22-04-2013, 15:23
Olá a todos. Estou a fazer um algoritmo em lisp para ordenar uma lista sem recorrer a < ou >. Tem de ser totalmente recursivo. Para isso devo criar uma lista auxiliar, apenas com 0 e, à medida que leio a lista originar devo incrementar 1 valor nos índices correspondentes da lista auxiliar.
L->(1 3 5 )
Laux->(0 0 0 0 0 .....)
(0 1 0 1 0 1 0 0 0 ... )
Para isso usei uma função incrementa e uma função processa, mas o resultado que tenho é, para o exemplo acima: (0 0 0 0 0 1 0 0 0 .. ) ou seja, na lista auxiliar, apenas aparece incrementado o último valor da lista original.
Alguém me consegue ajudar com isto ?
Obrigado
L->(1 3 5 )
Laux->(0 0 0 0 0 .....)
(0 1 0 1 0 1 0 0 0 ... )
Para isso usei uma função incrementa e uma função processa, mas o resultado que tenho é, para o exemplo acima: (0 0 0 0 0 1 0 0 0 .. ) ou seja, na lista auxiliar, apenas aparece incrementado o último valor da lista original.
Alguém me consegue ajudar com isto ?
Código:
;Função que incrementa um dado indice numa lista
(defun Incrementa (indice l)
(if ( = indice 0)
(cons ( + 1 (car l) ) (cdr l) )
(cons (car l) (incrementa ( - indice 1) (cdr l) ) )
)
)
;Função para processar uma lista, incrementando na auxiliar. Ainda não funciona
(defun processa (l tam)
(cond
( (null l) nil)
( (null (cdr l) ) (incrementa (car l) laux ) )
( t (progn
(incrementa (car l) laux)
(processa (cdr l) ( - tam 1) )
)
)
)
)
Obrigado