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
, как просили в вопросе. Идея состоит в том, чтобы пройти первый список, воссоздавая его поэлементно, пока список не будет исчерпан - в этот момент следующим элементом будет второй список.