【问题标题】:Deep reverse function in LispLisp 中的深度反向函数
【发布时间】:2017-05-29 17:34:50
【问题描述】:

我想在 Lisp 中写一个深度反向函数,只依赖 Lisp 提供的原始反向函数,以及其他一些常见的东西。我认为使用地图更容易做到这一点,例如:

(defun deep-reverse (list)
  (if (listp list)
      (mapcar #'deep-reverse
              (reverse list))
      list))

但是如果不使用这些地图或其他结构呢?仅仅依靠ifreverseappendnullnillistpatomconscarcdr等东西。基本的东西。我可以做一个一级反向,像这样:

(defun reverse (list)
  (if (null list)
     'nil
      (append (reverse (cdr list))
              (cons (car list) 'nil))))

但是我怎样才能实现这样的深度反向呢?我所说的深度反向是,如果函数的输入是((1 2 3) (4 5 6)),那么输出应该是((6 5 4) (3 2 1))

【问题讨论】:

    标签: lisp common-lisp


    【解决方案1】:

    你快到了:

    (defun deep-reverse (list)
      (if (consp list)
          (nconc (deep-reverse (cdr list))
                 (list (deep-reverse (car list))))
          list))
    (deep-reverse  '((1 2 3) (4 5 6)))
    ==> ((6 5 4) (3 2 1))
    

    与您的版本相比,我需要进行一些更改:

    1. carcdr致电deep-reverse
    2. 使用nconc 而不是append 以避免不必要的欺骗。
    3. reverse 重命名为deep-reverse
    4. consp 上的分支递归,而不是 null

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-28
      • 2023-04-07
      • 1970-01-01
      • 2018-12-25
      • 1970-01-01
      相关资源
      最近更新 更多