#scheme #racket
#схема #racket
Вопрос:
Как мы проверяем в scheme с помощью do cicle, находится ли элемент из первого списка во втором?
Комментарии:
1. Вам действительно нужно предоставить еще несколько деталей, чтобы получить ответ.
2. Это домашнее задание, да? Повторно отметьте, если нет.
3. Большинство циклов не являются кругами. Такие вещи, как
do
цикл, не являются кругами, поэтому я был очень смущен, когда увидел этот вопрос, и я не мог понять, что вы имели в виду, пока не увидел ответ
Ответ №1:
Цикл do в racket имеет интересную структуру:
(do ([id init-expr step-expr-maybe] ...)
(stop?-expr finish-expr ...)
expr ...)
В документации для r5rs приведен пример:
(let ((x '(1 3 5 7 9)))
(do ((x x (cdr x))
(sum 0 ( sum (car x))))
((null? x) sum)))
Этот оператор возвращает 25, сумму элементов цикла. x
В цикле do инициализируется на x
в let, а затем итеративно устанавливается на cdr
самого себя каждый раз в цикле. sum
инициализируется значением 0 и накапливает значение car
of x
каждый раз до конца. Условием остановки является то, что переменная итерации пуста, а возвращаемое значение является суммой.
Хорошо, если не считать предпочтения квадратных скобок для ракетки, это выглядит неплохо. Есть цикл выполнения и список. Цикл выполняет что-то над этим списком. Мы можем использовать это для написания функции, которая находит определенный атом в списке (используя скобки racket):
(define (find5 lst)
(do ([x lst (rest x)]
[found #f (or found (eq? 5 (first x)))])
((null? x) found)))
Вместо инициализации и добавления значения sum
, я or
в found
. Кроме того, я предпочитаю first
и rest
вместо car
и cdr
и определяю их сам, когда они не существуют. Способ работы этой функции должен следовать из объяснения примера.
(find5 '(1 2 3 4 6))
Выдает #f, как и ожидалось. Аналогично:
(find5 '(1 2 3 4 5 6))
Выдает #t.
Можете ли вы обобщить поиск определенного элемента в списке с помощью цикла do в свой конкретный вопрос?
Комментарии:
1. да, спасибо за ответ. Я не был знаком с cicle в scheme, я пытался понять, но я понимаю только простые функции, но вчера мне нужно было создать функцию, которая проверяет, есть ли элемент во втором списке. И я не смог этого сделать, потому что не смог понять условие остановки.