Soy nuevo en la raqueta y recientemente comencé a aprender funciones de listas abstractas. Tengo que escribir una función (same-country airports code) que consume una lista de aeropuertos airports y un código de tres letras que representa un aeropuerto. La función produce una lista de todos los códigos de aeropuerto que tienen el mismo país que el aeropuerto dado, ordenados en orden alfabético ascendente. Si el código no está en la lista de asociación, la función produciría un vacío.

Por ejemplo:

(define alist (list (list "YYZ" (list "Toronto" "Canada"))
                    (list "YWG" (list "Winnipeg" "Canada"))
                    (list "BGO" (list "Bergen" "Norway"))
                    (list "TRF" (list "Sandefjord" "Norway"))
                    (list "YUL" (list "Montreal" "Canada"))
                    (list "LHR" (list "London" "England"))
                    (list "YVR" (list "Vancouver" "Canada"))))

Entonces

(same-country alist "YUL") => (list "YUL" "YVR" "YWG" "YYZ")

¿Alguien puede mostrarme cómo resolver este problema / darme una plantilla? No se me permite usar ninguna función auxiliar con nombre en este problema, solo lambda ... Sabía cómo hacerlo mientras usaba la recursividad explícita, pero no entiendo lo suficientemente bien las funciones de lista abstracta

0
Sillage 17 nov. 2019 a las 06:03

1 respuesta

La mejor respuesta

Versión 3

; please tell us which language you use (in front of code)
; please take effort before adding comment
; language:intermediate student with lambda
(define same-country-v2
  (λ (airport-ls airport-name)
    ((λ (ls name1 name2)
       ; result
       (sort
        (map (λ (p) (first p))
             (filter (λ (x)
                       (or (equal? name1 (first (second x)))
                           (equal? name2 (second (second x)))))
                     ls))
        string<=?))
     airport-ls
     ; city name
     (first ((λ (airports airport-name) (second (first (filter (λ (x) (equal? (first x) airport-name)) airports)))) airport-ls airport-name))
     (second ((λ (airports airport-name) (second (first (filter (λ (x) (equal? (first x) airport-name)) airports)))) airport-ls airport-name)))))

;;; TEST
(same-country-v2 airports "YUL")
(same-country-v2 airports "BGO")

0
tjorchrt 5 dic. 2019 a las 07:44