#lisp #common-lisp
#lisp #common-lisp
Вопрос:
Я хочу создать функцию, которая проверяет, попадают ли номера списка в диапазон от 1 до 10 (включая 1 и 10). Если они это сделают, я хотел бы добавить ее в новый список, который я создал. Однако, если они не попадают в диапазон, я решил преобразовать их так, чтобы они соответствовали, а не отбрасывать их (путем добавления (1 (случайных 10)).
(defun fit (lst)
"(lst) check every number if it fits the range (1-10)"
(do ((fit lst (cdr fit))
(range nil))
((null fit) (reverse range))
(if (and (>= fit 1) (=< fit 10))
(seft ((cons fit range))))
(or (< fit 1) (> fit 10))
(cons ( fit (1 (random 10))) range)))
Коды начинаются с (defun fit …) . Однако это не работает, и мне не хватает каких-либо изменений, которые я могу внести, в основном из-за моих ограниченных знаний. Любая помощь или понимание будут высоко оценены.
Спасибо.
Ответ №1:
Я думаю, вы пытаетесь сделать слишком много работы самостоятельно. Подумайте о более высоких функциях. Ваша постановка задачи уже говорит вам половину этого: «проверьте каждое число, если оно вписывается в диапазон 1-10″.
Как насчет использования (каждого)? Затем вам нужно передать ей функцию, которая проверяет одно число. Вероятно, лямбда…
Ответ №2:
Как насчет этого:
(defun fit (list)
(cond ((null list) '())
((< (car list) 1)
(fit (cons ( (car list) (random 10)) (cdr list))))
((> (car list) 10)
(fit (cons (- (car list) (random 10)) (cdr list))))
(t (cons (car list) (fit (cdr list))))))
Комментарии:
1. Спасибо!!! Ты вернул мне рассудок… Я не думал об использовании cond. Я подумал, что если я собираюсь перебирать это, лучший вариант — DO. Я очень ценю ваше время и усилия.
2. Использование цикла и СБОРА (или IF и COLLECT) также является опцией.
Ответ №3:
Я думаю, что вы хотите применить make-fitting
функцию к каждому элементу.
(defun make-fitting (n)
(loop (incf n
(cond ((> n 10) (- (1 (random 10))))
((< n 1) (1 (random 10)))
(t (return-from make-fitting n))))))
(defun fit (list)
(mapcar #'make-fitting list))
Если вы ожидаете других ограничений, вы должны указать их в качестве возможных необязательных параметров:
(defun make-fitting (n amp;optional (low 1) (high 10))
(let ((step-size (1 (- high low))))
(flet ((random-step (size)
(1 (random size))))
(loop (incf n
(cond ((> n high) (- (random-step step-size)))
((< n low) (random-step step-size))
(t (return-from make-fitting n))))))))