MIT Scheme Expression альтернативная форма добавления

В настоящее время я пытаюсь решить вопрос в среднесрочной практике. Вопрос просит меня написать выражение для добавления двух списков (давайте назовем их list1 и list2), а list2 должен быть добавлен в конец list1. Функция append не может быть использована ни в одном месте. То, что я могу использовать, это " минусы", " фильтровать", " накапливать", " отображать", "ref-list" и "перечислять интервал" Я пытался получить различные формы решения, такие как

(cons list1 list2)

(filter list? (map list (cons list1 list2)))

(list list1 list2)

(map list (list list1 list2)) 

Я потратил 2 дня, пытаясь найти решение безрезультатно. Если кто-нибудь сможет направить меня в правильном направлении или даже оказать мне какую-то помощь, я буду благодарен.

Кроме того, я прошу прощения, если есть какой-то протокол, который я придерживаюсь неправильно для форматирования кода или манеры в вопросе, так как я новичок на сайте. Спасибо.

1 ответ

Решение

Поскольку это домашнее задание, я не могу дать вам прямой ответ. Вместо этого, я дам вам несколько советов, вы можете найти ответ на свой вопрос, заполнив пробелы. Это стандартный способ реализации append:

(define (my-append l1 l2)
  (cond (<???>                          ; if the first list is null
         <???>)                         ; then return the second list
        (<???>                          ; if the second list is null
         <???>)                         ; then return the first list
        (else                           ; otherwise `cons`
         (cons <???>                    ; the first element of the first list
               (my-append <???> l2))))) ; process the rest of the first list

Вышеупомянутое решение использует cond, null?, cons, car а также cdr, Если вы не можете использовать ни один из них, и вы ограничены процедурами в вопросе, попробуйте вместо этого (при условии, accumulate определяется как сгиб справа):

(define (my-append l1 l2)
  (accumulate
   <???>   ; what should be used for sticking list elements together?
   <???>   ; what should we return if the list being traversed is empty?
   <???>)) ; this is the list that we want to traverse 

Вышеупомянутое решение использует только accumulate а также cons, как просили в вопросе. Идея состоит в том, чтобы пройти первый список, воссоздавая его поэлементно, пока список не будет исчерпан - в этот момент следующим элементом будет второй список.

Другие вопросы по тегам