-1

我正在尝试在 Common Lisp 中编写一个函数,以递归方式将基数为 10 的数字转换为基数为 8 的数字,以列表的形式表示。

这是我到目前为止所拥有的:

(defun base8(n)
(cond
    ((zerop (truncate n 8)) (cons n nil))
    ((t) (cons (mod n 8) (base8 (truncate n 8))))))

当我输入数字 < 8 和 > -8 时,此函数工作正常,但递归情况给我带来了很多麻烦。当我尝试 8 作为参数(应该返回(1 0))时,我得到一个错误Undefined operator T in form (T)

提前致谢。

4

2 回答 2

3

只是为了好玩,这是一个没有递归的解决方案,使用内置功能:

(defun base8 (n)
  (reverse (coerce (format nil "~8R" n) 'list)))
于 2013-11-07T11:50:54.907 回答
2

似乎您忘记了,(defun t ...)或者这不是t您打算在条件下拥有的功能?也许这是t真值?

Common Lisp 的双重命名空间特性使得 t 既可以是函数又可以是真值。不同之处在于您使用它的上下文,并且您显然正在尝试将t其作为函数/宏应用。

这是为真值而不是t函数编辑的代码:

(defun base8(n)
  (cond
    ((zerop (truncate n 8)) (cons n nil))
    (t (cons (mod n 8) (base8 (truncate n 8))))))

(base8 8) ; ==> (0 1)
于 2013-11-04T17:48:11.893 回答