我正在尝试从数字列表开始创建数字列表。
例如,我想将 (11 4 6) 分解为 (1 5 6),方法是将列表的头部除以 10(如果头部 >= 10)并将 1 加到下一个元素。
我的代码看起来像这样
(defun createparameters (l)
(cond ((null l) l)
((> 9 (car l)) (setf (car l) (mod (car l ) 10))
(setf (cadr l) (+ (cadr l) 1)))
(t (createparameters (cdr l)))))
但它不会改变我的引用列表。 将不胜感激。
最佳答案
您写道,如果第一个元素大于 9,您希望完成操作,但在您的代码中,您做的恰恰相反。 (> 9 (car l))
与中缀 9 > (car l)
相同,因此当第一个元素为 8 或更低时,您可以执行您的操作。
这是您的代码的功能版本,它继续处理下一个子列表:
(defun createparameters (l)
(cond ((null l) l)
((and (consp l) (< 9 (car l)))
(cons (mod (car l ) 10)
(createparameters
(cons (+ (cadr l) 1)
(cddr l)))))
(t (cons (car l)
(createparameters (cdr l))))))
(defparameter test (list 11 11 2 3))
(setf test (createparameters test))
test ; ==> (1 2 3 3)
这是修改后的变异版本(类似于您的代码):
(defun createparameters (l)
(cond ((null l) l)
((< 9 (car l)) (setf (car l) (mod (car l ) 10))
(setf (cadr l) (+ (cadr l) 1))
(createparameters (cdr l)))
(t (createparameters (cdr l)))))
(defparameter test (list 11 11 2 3))
(createparameters test)
test ; ==> (1 2 3 3)
我开始怀疑这是不是进位,所以第一个元素是最低有效位,最后一个是最高位。如果是这样,仅当数字始终低于 20 时加一才有效,如果最后一位数字变为 10 或更高,代码将无效。
关于lisp - 将数字列表分解为数字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23872701/