【问题标题】:Convert decimal number to octal in Lisp在 Lisp 中将十进制数转换为八进制
【发布时间】:2013-11-04 17:38:00
【问题描述】:

我正在尝试在 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 作为参数(应该返回 (1 0))时,我收到错误 Undefined operator T in form (T)

提前致谢。

【问题讨论】:

    标签: lisp decimal common-lisp octal


    【解决方案1】:

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

    (defun base8 (n)
      (reverse (coerce (format nil "~8R" n) 'list)))
    

    【讨论】:

    • 谢谢,但特别是对于练习,我认为这不是最有帮助的。
    • 对。这是唯一的欢乐。
    【解决方案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)
    

    【讨论】:

    • 谢谢!我的意思是 t 是真值。这修复了它,所以它可以按我的预期工作。现在我想要我要返回的反向列表。是否可以仅在一个函数中执行此操作,还是必须有一个辅助函数?
    • 没关系,我想通了: (defun base8(n) (cond ((zerop (truncate n 8)) (cons n nil)) (t (append (base8 (truncate n 8)) (缺点 (mod n 8)) nil)))))
    猜你喜欢
    • 1970-01-01
    • 2011-08-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-31
    • 1970-01-01
    • 2017-02-19
    • 2016-11-22
    相关资源
    最近更新 更多