Как добавить два элемента списков вместе в один список в схеме? - PullRequest
0 голосов
/ 02 октября 2019

Я работаю над основами Схемы, и мне нужно найти способ добавить два элемента списков вместе (x1 + x2, y1 + y2, z1 + z2) в один список, чтобы он стал (x3, y3, z3))!

Я выяснил, что для вычитания элементов двух списков я могу использовать ключевое слово «remove», а для добавления элементов list2 в list1 я могу использовать «append», есть ли что-то похожее для добавленияфактические элементы вместе?

Вот что у меня пока есть:

(define (my-vector x y z) (list x y z ))

(define first-vector '(1 2 3))

(define second-vector '(4 5 6))

first-vector

second-vector

(define (get-x1 first-vector)(car first-vector))
(define (get-y1 first-vector)(car (cdr first-vector)))
(define (get-z1 first-vector)(car (cdr (cdr first-vector))))

(define (get-x2 second-vector)(car second-vector))
(define (get-y2 second-vector)(car (cdr second-vector)))
(define (get-z2 second-vector)(car (cdr (cdr second-vector))))

(define (combine-vectors first-vector second-vector)
  (if (null? first-vector)
      second-vector
      (cons (car first-vector)
        (combine-vectors (cdr first-vector) second-vector))))


(define combined-vectors (combine-vectors first-vector second-vector))

combined-vectors

(define subtract-vectors (remove '(first-vector) second-vector))

(+ (get-x1 first-vector) (get-x2 second-vector))
(+ (get-y1 first-vector) (get-y2 second-vector))
(+ (get-z1 first-vector) (get-z2 second-vector))

вывод в настоящее время

(list 1 2 3)
(list 4 5 6)
(list 1 2 3 4 5 6)
5
7
9

Я хочу, чтобы 5 7 9 прочитал (список 5 79)! Спасибо за любую помощь заранее:)

1 Ответ

1 голос
/ 02 октября 2019

Как отметил Алекс в комментариях, map ваш лучший друг здесь. Небольшой комментарий: вы работаете с списками , а не с векторами:

(define (add-lists l1 l2)
  (map + l1 l2))

Длинной и скучной альтернативой будет сделать ту же итерацию и обработку вручную, применяя стандартный шаблондля обхода списка и построения выходного списка с небольшой модификацией, которую мы сделаем одновременно для двух списков:

(define (add-lists l1 l2)
  (if (or (null? l1) (null? l2))
      '()
      (cons (+ (car l1) (car l2))
            (add-lists (cdr l1) (cdr l2)))))

В любом случае, он работает как положено:

(define first-list '(1 2 3))
(define second-list '(4 5 6))

(add-lists first-list second-list)
=> '(5 7 9)
...