【问题标题】:integer to a binary list in LISP using recursion使用递归将整数转换为 LISP 中的二进制列表
【发布时间】:2016-03-16 04:53:01
【问题描述】:

采用整数并创建二进制列表的递归函数。

我不明白为什么,如果 (binList 5) 将输出 (1 0 1) 这是正确的,而 (binList 10) 的代码导致 (append (binlist 5) '(0)) 不给我(1 0 1 0),但给我(1 1 0 0)。我什至用 Java 写了同样的想法,并且成功了。递归在 Lisp 中的工作方式是否不同?还是我遗漏了什么?

(defun binList(N)
    (cond 
        ((< N 1) '())
        ((= N 1) '(1))
        ((> N 1) (if(=(mod N 2) 0) 
                      (append (binList(/ N 2)) '(0))
                      (append (binList(floor(/ N 2))) '(1))))))

【问题讨论】:

  • 重复调用APPEND 将元素添加到单链表的末尾是不好的。尝试找出原因。将新元素添加到单链表的前面。

标签: list recursion binary lisp


【解决方案1】:

您的代码实际上产生了正确的结果:

CL-USER> (binlist 10)
(1 0 1 0)

只有几个cmets:

  • 请使用 Lisp 命名约定:CL 不区分大小写,所以 binList 只是 BINLIST,在这里还不错,但 bin-list 会更好。
  • 检查(&gt; n 1) 是多余的。

考虑到这个 cmets,代码如下:

(defun bin-list(n)
  (cond ((< n 1) '())
        ((= n 1) '(1))
        ((zerop (mod n 2)) (append (bin-list (/ n 2)) '(0)))
        (t (append (bin-list (floor (/ n 2))) '(1)))))

如果递归代码给您带来意想不到的结果,首先要做的是跟踪它:

CL-USER> (trace bin-list)
(BIN-LIST)
CL-USER> (bin-list 10)
  0: (BIN-LIST 10)
    1: (BIN-LIST 5)
      2: (BIN-LIST 2)
        3: (BIN-LIST 1)
        3: BIN-LIST returned (1)
      2: BIN-LIST returned (1 0)
    1: BIN-LIST returned (1 0 1)
  0: BIN-LIST returned (1 0 1 0)
(1 0 1 0)

正如您所指出的,(bin-list 10) 结果为(append (bin-list 5) '(0))。在这里您可以看到原始呼叫(呼叫 0)(bin-list 10) 导致呼叫 (bin-list 5)(呼叫 1)。呼叫 1 返回(1 0 1)。最后,调用 0 将 0 附加到末尾。

如果这不起作用,那么您可以调用调试器:请参阅 this blog 获取有关 Common Lisp 调试器(使用 SLIME)的教程。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-07-14
    • 2018-08-28
    • 2012-03-20
    • 2017-07-11
    • 2012-04-19
    • 1970-01-01
    • 2013-09-23
    • 1970-01-01
    相关资源
    最近更新 更多