定义递归函数以计算公共lisp中数字中的数字位数

时间:2013-11-16 07:18:50

标签: recursion common-lisp

这就是我所做的,直到现在它告诉我它不是类型列表。

(defun number_list(n)
  (setf x 
        (if (zerop (truncate n 10)) 
          (list n)
          (append (number_list (truncate n 10)) (list (mod n 10)))))
  (length x))

当我删除(长度x)时,我可以看到结果是一个列表。

感谢任何帮助。

2 个答案:

答案 0 :(得分:2)

您的解决方案使用全局变量x,这通常是一个坏主意,尤其是在递归函数中。然后,您创建一个列表以计算位数。这不是必要的。

使用列表

如果您想使用列表,我建议您将问题分为两部分:

1。将数字转换为列表

如果您删除setf x

,您的功能就可以正常运行
(defun number_list(n)
  (if (zerop (truncate n 10)) 
    (list n)
    (append (number_list (truncate n 10)) (list (mod n 10)))))

2。计算位数

(defun numdigits (n)
  (length (number_list n))).

<强>替代

但我会建议一个简单的递归定义,例如:

(defun numdigits (n)
  (if (< -10 n 10)
    1
    (1+ (numdigits (truncate n 10)))))

答案 1 :(得分:0)

如果你想获得十进制数字然后计算长度,假设数字是0或更大的整数。

(defun number-list (n) 
  (if (< n 10) 
      (list n)
    (cons (mod n 10)
          (number-list (truncate n 10)))))

CL-USER 44 > (length (number-list 123456789))
9

但最好直接计算数字。请参阅其他答案。