Ir para o conteúdo

Junta-ordenado

Versão com números repetidos

O procedimento junta-ordenado tem dois parâmetros, crescente-1 e crescente-2, que são duas listas com elementos numéricos ordenados do menor para o maior. Sabe-se que junta-ordenado devolve uma lista cujos elementos são os elementos das listas dadas, em ordem crescente.

; Resolvido por: Eduardo Pinto (eduardo.pinto@fe.up.pt)
(define junta-ordenado
  (lambda (crescente-1 crescente-2) 
    (cond 
      ((null? crescente-1) crescente-2)
      ((null? crescente-2) crescente-1)

      ((<= (car crescente-1) (car crescente-2))
       (cons (car crescente-1) 
             (junta-ordenado (cdr crescente-1) crescente-2)))

      ((>= (car crescente-1) (car crescente-2)) 
       (cons (car crescente-2) 
             (junta-ordenado (cdr crescente-2) crescente-1))))))

Exemplo:

> (junta-ordenado '(1 2 7 8) '(1 3 4 5 9))
(1 1 2 3 4 5 7 8 9)

Versão sem números repetidos

O procedimento junta-ordenado-sem-repetidos, com os mesmo parâmetros que junta-ordenado, não inclui elementos repetidos na lista que devolve.

; Resolvido por: Eduardo Pinto (eduardo.pinto@fe.up.pt)
(define junta-ordenado-sem-repetidos
  (lambda (crescente-1 crescente-2)
    (cond 
      ((null? crescente-1) crescente-2)
      ((null? crescente-2) crescente-1)

      ((< (car crescente-1) (car crescente-2))
       (cons (car crescente-1) 
             (junta-ordenado-sem-repetidos (cdr crescente-1) crescente-2)))

      ((> (car crescente-1) (car crescente-2)) 
       (cons (car crescente-2) 
             (junta-ordenado-sem-repetidos (cdr crescente-2) crescente-1)))

      ((= (car crescente-1) (car crescente-2))
       (cons (car crescente-2) 
             (junta-ordenado-sem-repetidos (cdr crescente-1) (cdr crescente-2)))))))

Exemplo:

> (junta-ordenado-sem-repetidos '(1 2 7 8) '(1 3 4 5 9))
(1 2 3 4 5 7 8 9)