在Common Lisp的一个问题
-
27-09-2019 - |
题
我越来越疯狂的小问题就在这里,
我不断收到一个错误,我似乎无法找出原因,
该代码应该更改列表范围内,
所以,如果我们给它的值(1 2 3 4)
名单,我们希望在11的范围内改变到十四结果将是(11 12 13 14)
问题是,所谓的scale-list
最后的功能将归还一个错误,说:
调试器输入 - Lisp的误差:(错型参数数或标志物 - 对无)
任何人有任何线索,为什么? 我用aquamacs作为一个编辑 由于事先
;;finds minimum in a list
(defun minimum (list)
(car (sort list #'<)))
;;finds maximum in a list
(defun maximum (list)
(car (sort list #'>)))
;;calculates the range of a list
(defun range (list)
(- (maximum list) (minimum list)))
;;scales one value to another range
(defun scale-value (list low high n)
(+ (/ (* (- (nth (- n 1) list)
(minimum list))
(- high low))
(range list))
low))
;;is supposed to scale the whole list to another range
(defun scale-list (list low high n)
(unless (= n 0)
(cons (scale-value list low high n)
(scale-list list low high (- n 1)))))
(scale-list '(1 2 3 4) 21 24 4)
解决方案
最大和最小必要的定义加以改进。排序是破坏性的。这也是错误的与像一个常量SORT调用“(1 2 3 4) - 。再次,SORT是破坏性
更好的定义:
(defun minimum (list)
(reduce #'min list))
(defun maximum (list)
(reduce #'max list))
的范围内的更有效的定义:
(defun range (list)
(loop for e in list
maximize e into max
minimize e into min
finally (return (- max min))))
SCALE-LIST和SCALE-VALUE也不类Lisp。 如果你在一个递归函数调用NTH这样便什么是错的。你应该递归在列表上,而不是指数。 SCALE-VALUE来电范围和最小为每个呼叫。为什么呢?
检查此变体:
;;scales one value to another range
(defun scale-value (item low high min range)
(+ (/ (* (- item min)
(- high low))
range)
low))
;;is supposed to scale the whole list to another range
(defun scale-list (list low high)
(let ((min (minimum list))
(range (range list)))
(labels ((scale-list-aux (list)
(when list
(cons (scale-value (first list) low high min range)
(scale-list-aux (rest list))))))
(scale-list-aux list))))
(scale-list '(1 2 3 4) 21 24)
你能提高吗?例如,我会摆脱递归与MAPCAR取代它。
其他提示
我重新发布代码,因为出事了......
;;finds minimum in a list
(defun minimum(list)
(car (sort list #'<)))
;;finds maximum in a list
(defun maximum(list)
(car (sort list #'>)))
;;calculates the range of a list
(defun range(list)
(- (maximum list) (minimum list)))
;;scales one value to another range
(defun scale-value(list low high n)
(+ (/ (* (- (nth (- n 1) list) (minimum list)) (- high low)) (range list)) low))
;;is supposed to scale the whole list to another range
(defun scale-list(list low high n)
(unless (= n 0)
(cons (scale-value list low high n) (scale-list list low high (- n 1)))))
(scale-list '(1 2 3 4) 21 24 4)
您实际的堆栈跟踪是这样的:
-(nil 0.1)
(* (- (nth ... list) (minimum list)) (- high low))
(/ (* (- ... ...) (- high low)) (range list))
(+ (/ (* ... ...) (range list)) low)
scale-value((0.1) 20 30 3)
我想你确定一个错误的第n个元素和这个返回nil,其搅乱减法。
不隶属于 StackOverflow