【问题标题】:Wrong argument type listp, "GIF" When reverse a list错误的参数类型 listp, "GIF" 反转列表时
【发布时间】:2019-11-16 02:18:03
【问题描述】:

我写了这样一个函数来反转一个列表

练习 2.18。定义一个以列表为参数并以相反顺序返回相同元素的列表的过程 reverse:

#+begin_src emacs-lisp :session sicp :lexical t
(defun reversex(item)
  (cond
   ((null item) nil)
   ((cons (reversex (cdr item))
          (car item)))
   ))
(reversex (list 1 4 9 16 25))
#+end_src

第一次运行得到以下输出:

#+RESULTS:
: (((((nil . 25) . 16) . 9) . 4) . 1)

但是第二次运行,报错:

  Wrong argument type listp, "GIF"

【问题讨论】:

    标签: lisp elisp sicp


    【解决方案1】:

    不清楚“GIF”的来源,因为您没有为您提到的“第二次运行”提供输入。无论如何,您反转列表的算法不正确,您应该构建一个 正确的列表 作为输出,但不是这样:

    (((((nil . 25) . 16) . 9) . 4) . 1)
    

    应该是这样的:

    '(25 . (16 . (9 . (4 . (1 . nil)))))
    

    这是一种方法 - 使用累加器参数。还要注意condelse 条件应该如何写:

    (defun reversex (lst acc)
      (cond
        ((null lst) acc)
        (t (reversex (cdr lst) (cons (car lst) acc)))))
    
    (reversex '(1 4 9 16 25) nil)
    => (25 16 9 4 1)
    

    【讨论】:

    • sip 太棒了,我发现我的错误解决方案是练习 2.22,它暴露了一个错误作为练习。
    猜你喜欢
    • 2017-08-23
    • 1970-01-01
    • 1970-01-01
    • 2014-01-05
    • 2021-08-05
    • 2018-12-01
    • 2014-05-22
    • 2021-06-16
    相关资源
    最近更新 更多