2009-09-14 3 views

ответ

5

Вы находитесь на правильном пути, но ваши последние два условия имеют одно и то же действие, которое должно указывать на то, что один из них не делает то, что должен. В самом деле, второе условие, listp, неверно, потому что, когда это список, вам нужно добавить реверс этого списка вместо немодифицированного списка. Возможное решение:

(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)) 

Как вы можете видеть, единственное отличие состоит в том, что вы проверить, если первый элемент списка, и если да, то вы реверс первый элемент перед добавлением его.

+1

немного короче: (DEFUN мой обратного хода (L) (если (null l) nil (прилагается (мой-реверс (cdr l)) (список (если (списокp (машина l)) (мой-реверс (машина l)) (машина l)))))) – jlf

0

Похоже, проблема в выполнении домашних заданий :)

Похоже, что вы начали, написав очередной обратный код. Я дам вам подсказку: второе условие (listp L) не совсем правильно (это всегда будет правда). Вы хотите проверить, есть ли что-то еще список.

2

я бы написать так:

(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))) 
0

ответ dmitry_vk (который, вероятно, является быстрее в большинстве Лиспах, чем при использовании добавления в предыдущих примерах) в более lispish образом:

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

Или даже:

(defun reverse-all (list) 
    (let ((result nil)) 
    (dolist (element list result) 
     (push 
     (if (listp element) (reverse-all element) element) 
      result)))) 
Смежные вопросы