Recursion LISP-递归回文

Recursion LISP-递归回文,recursion,lisp,common-lisp,palindrome,Recursion,Lisp,Common Lisp,Palindrome,我想写一个递归回文函数。该代码使用以下两种功能工作: (设置str(a b c d)) 但是,我尝试将其合并为一个函数: (defun palindrome (l) (cond ( (null l) nil ) (T (append str(append (palindrome (cdr l)) (list (car l))) ) ) ) ) 这将返回(A

我想写一个递归回文函数。该代码使用以下两种功能工作: (设置
str
(a b c d))

但是,我尝试将其合并为一个函数:

(defun palindrome (l)
    (cond
        ( (null l)
                nil
        )
        (T 
            (append str(append (palindrome (cdr l)) (list (car l))) )
        )
    )
)
这将返回(A B C D A B C D A B C D A B C D D C B A)

我希望它返回(a b c d c b a),然后最终返回(a b c d c b a)**当它反转时不重复最后一个字符


我知道有更简单的方法来实现这一点,我们预先定义了函数,但我试图挑战一下自己。但是我被困在这里,非常感谢您的帮助。

这里是一个递归的单函数回文:

(defun palindrome(l)
  (cond ((null l) nil)
        (t (append (list (car l)) (palindrome (cdr l)) (list (car l))))))
递归的结构是这样的:对列表的其余部分进行回文,并在列表的开头和结尾放置第一个元素

如果希望仅使用一次中心元素,以下是另一种版本:

(defun palindrome(l)
  (cond ((null l) nil)
        ((null (cdr l)) (list (car l)))
        (t (append (list (car l)) (palindrome (cdr l)) (list (car l))))))

也就是说,您必须为递归函数的终止添加一个新的案例:当只有一个元素时也终止,并返回该元素。

最后一个函数中有一个错误:
str
是一个未定义的变量。str是较早设置的,我将更新帖子。谢谢,我会投票,但我还没有声誉。然后,我只需要获取被评估列表的CDR来完成第二个函数,其中它返回一个bc D cb A?回文的第一个定义不是递归的,通过简单地将列表与其反向连接就解决了这个问题。您的第二个回文函数是递归的,因为它调用自身。这几乎是正确的,唯一要做的事情就是用
(list(car l))
替换
str
,因为
str
是一个常量值(您要使其成为回文的列表),而在调用递归构建某种结构的函数时,您应该只使用参数。我想你可以将答案标记为你问题的解决方案,即使你没有向上投票的名声,谢谢!太棒了,我仍然不知道如何让它返回一个B C D C B A。我对递归不熟悉,但我知道我基本上需要将列表的CDR附加到一个B C D上,对吗?我更改了答案,提供了一个只维护一次中心元素的替代版本。在编写递归函数时,应该注意两个基本问题:递归如何在数据上“模式化”,以及递归终止的方式。在这种情况下,函数的终止会完全改变结果。
(defun palindrome(l)
  (cond ((null l) nil)
        ((null (cdr l)) (list (car l)))
        (t (append (list (car l)) (palindrome (cdr l)) (list (car l))))))