【问题标题】:Define a recursive function to count the numbers of digits in a number in common lisp在 common lisp 中定义一个递归函数来计算数字中的位数
【发布时间】:2013-11-29 17:19:14
【问题描述】:

这是我到目前为止所做的,它告诉我它不是列表类型。

(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))

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

不胜感激。

【问题讨论】:

  • 您的代码的一个问题是使用(length x),结果不再是列表。有关解决方案:请参阅 uselpa 的答案。
  • 您可能也对这个问题感兴趣:stackoverflow.com/questions/19892507 除此之外,使用返回整数位数的integer-length 可以大大加快算法速度。但如果您只对fixnum 感兴趣,那么最好使用表格(max-positive-fixnum 总共有 19 位数字)。

标签: recursion common-lisp


【解决方案1】:

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

【讨论】:

  • 应避免在递归函数中使用 append 将元素添加到列表末尾
  • 哦,谢谢。我只是不知道如何在我的函数中使用长度。这就是你从第一个函数中获取数据的方式。
  • @user2976636 您的函数的一个问题是它有时返回一个列表,有时返回一个数字。如果将两者分开,则解决方案很简单。
  • 这有效并满足了所提出的具体问题,尽管我可能会选择(defun num-digits (n &amp;optional (base 10)) (ceiling (log (1+ n) base))),只要我能保证 n 为 1 或更高(我猜,特例 0 可以) .
  • @Vatine 我个人最喜欢的是(defun numdigits (n) (length (write-to-string (abs n)))),但这也不能回答 OP 的问题。
【解决方案2】:

如果你想得到十进制数字然后计算长度,假设数字是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

但最好直接数数字。查看其他答案。

【讨论】:

    猜你喜欢
    • 2018-05-16
    • 2018-06-29
    • 1970-01-01
    • 2023-04-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-12
    • 1970-01-01
    相关资源
    最近更新 更多