recursion - 定义一个递归函数来计算common lisp中数字的位数

标签 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)时,我可以看到结果是一个列表。

非常感谢任何帮助。

最佳答案

您的解决方案使用全局变量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)))))

关于recursion - 定义一个递归函数来计算common lisp中数字的位数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20015911/

相关文章:

c - C中的递归函数是如何工作的

c# - protobuf-net:检测到可能的递归

list - lisp 编程中的变量

lisp - 与常见的 lisp 库作斗争

variables - 通过使用 SETF 定义变量来避免错误

lisp - 在 Allegro CL 中更改可编辑文本值

common-lisp - 为什么每个常见的 lisp 都会返回所定义的内容

c - C 中的意外输出

recursion - LISP 中的 wheres-waldo 函数

recursion - 如何设置SQLITE_MAX_TRIGGER_DEPTH?