Как реализовать это в схеме - PullRequest
1 голос
/ 02 июня 2019

Я довольно новичок в Схеме, и у меня возникли некоторые проблемы с одним упражнением.

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

Например: (genlist 5 12) => (5 6 7 8 9 10 11 12)

Я уже делал в Python, но я не знаю, как реализовать в схеме.

Ответы [ 2 ]

1 голос
/ 02 июня 2019

Список, подобный (5 6 7), составлен как (cons 5 (cons 6 (cons 7 '()))), поэтому самое простое решение будет таким:

(genlist 8 7) ; ==> ()
(genlist 7 7) ; ==> (cons 7 (genlist 8 7))

Теперь это не лучший способ сделать это, просто самый простой.Лучшим способом было бы создать список от конца до начала с помощью помощника:

(genlist-helper 6 7 '())                  ; ==>
(genlist-helper 6 6 (cons 7 '()))         ; ==>
(genlist-helper 6 5 (cons 6 (cons 7 '())) ; ==>
(cons 6 (cons 7 '())

Теперь genlist просто вызывает помощника, предоставляя пустой список в качестве начального аккумулятора.Это также возможно сделать с помощью локальной процедуры, в которой вам не нужно добавлять первый параметр, поскольку он у вас есть для лексического замыкания, и вы можете даже сделать его намного проще, используя именованный let.

* 1012Я понятия не имею, как ты это сделал в Python.Я не помню, чтобы у питона были минусы.Знание Алгола, как правило, не помогает при изучении вашего первого языка LISP.Как будто вы делаете предположение, что, поскольку итальянский и испанский языки были настолько похожи, словенский язык должен быть также.
0 голосов
/ 02 июня 2019

Вы можете сделать это с помощью рекурсии.

Базовый случай для (genlist x y) - это когда x == y, в этом случае выведите (list x)

Рекурсивный останов будет от (genlist x y) до (genlist (+ x 1) y)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...