lisp - 将数字列表分解为数字

标签 lisp common-lisp

我正在尝试从数字列表开始创建数字列表。 例如,我想将 (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/

相关文章:

lisp - 在 LISP 中如何检查列表中的哪些元素可以被 5 整除?

lisp - Common Lisp 中的 Web 开发

list - 在 Lisp 中映射两个字符串列表(以简短的方式)?

macros - LISP:如何跟踪宏

common-lisp - 如何为给定类的子类专门化泛型函数

lisp - 读取语句被跳过,未绑定(bind)变量

functional-programming - 用 Racket 构建 map

lisp - 解释一下我的 LISP 代码

scheme - lisp vs scheme 中的 true 和 false 空值

LISP:在从文件中读取游戏板时格式化读取行的输出