Lisp语言中的深度反转函数
我想用Lisp编写一个深度反转函数,只依赖Lisp提供的原始反转函数和其他一些常见的东西。我认为使用地图更容易做到这一点,例如:Lisp语言中的深度反转函数,lisp,common-lisp,Lisp,Common Lisp,我想用Lisp编写一个深度反转函数,只依赖Lisp提供的原始反转函数和其他一些常见的东西。我认为使用地图更容易做到这一点,例如: (defun deep-reverse (list) (if (listp list) (mapcar #'deep-reverse (reverse list)) list)) 但如果不使用这些地图或其他结构呢。只需依靠一些基本的东西,比如if,reverse,append,null,nil,listp,at
(defun deep-reverse (list)
(if (listp list)
(mapcar #'deep-reverse
(reverse list))
list))
但如果不使用这些地图或其他结构呢。只需依靠一些基本的东西,比如if
,reverse
,append
,null
,nil
,listp
,atom
,cons
,car
,cdr
,等等。我可以做一个一级反转,像这样:
(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))
,您就快到了:
(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))
与您的版本相比,我需要做一些更改:
car
和cdr
上调用deep reverse
reverse
重命名为deep reverse
consp
上的分支递归,而不是null
(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))
与您的版本相比,我需要做一些更改:
car
和cdr
上调用deep reverse
reverse
重命名为deep reverse
consp
上的分支递归,而不是null