LISP: multi-level recursive reverse function

霸气de小男生 提交于 2019-12-24 04:26:13

问题


How to reverse a list such that every sublist is also reversed? This is what I have so far:

(defun REV (L)
  (cond
    ((null L) nil)
    ((listp L)
     (append
      (REV (cdr L))
      (list (car L))))
    (t
     (append
      (REV (cdr L)) 
      (list (car L))))))

回答1:


You are on the right track, but your last two conditions have the same action, which should give an indication that one of them is not doing what it should. Indeed, the second condition, the listp case, is not right, because when it's a list, you need to append the reverse of that list instead of the unmodified list. A possible solution:

(defun reverse (l)
  (cond ((null? l) nil)
        ((listp (car l)) (append (reverse (cdr l)) 
                                 (list (reverse (car l)))))
        (t
          (append (reverse (cdr l)) 
                  (list (car l))))))

>  (reverse '((1 2 3) (4 5 6)))
((6 5 4) (3 2 1))

As you can see, the only difference is that you test if the first element is a list, and if it is, you reverse the first element before appending it.




回答2:


I'd write it this way:

(defun reverse-all (list)
  (loop
     with result = nil
     for element in list
     if (listp element)
     do (push (reverse-all element) result)
     else do (push element result)
     finally (return result)))



回答3:


Sounds like a homework problem :)

Looks like you started by writing the regular reverse code. I'll give you a hint: The second condition (listp L) isn't quite right (it'll always be true). You want to be checking if something else is a list.




回答4:


dmitry_vk's answer (which probably is faster in most lisps than using append in the previous examples) in a more lispish way:

(defun reverse-all (list)
  (let ((result nil))
    (dolist (element list result)
      (if (listp element)
          (push (reverse-all element) result)
          (push element result)))))

Or even:

(defun reverse-all (list)
  (let ((result nil))
    (dolist (element list result)
      (push
        (if (listp element) (reverse-all element) element)
          result))))


来源:https://stackoverflow.com/questions/1422735/lisp-multi-level-recursive-reverse-function

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!