Function lisp自主开发的递归逆函数

Function lisp自主开发的递归逆函数,function,lisp,reverse,Function,Lisp,Reverse,我在lisp中编写了一个列表反转函数,我想对它进行测试,但我遇到了一个错误,无法解决它 函数和调用如下: (defun myreverse (list) (cond((null list) nil)) (cons (myreverse(cdr list) (car list)))) (myreverse '(1 2 3)) 任何帮助都将不胜感激 当您defunmyreverse时,参数是(list),因此当您调用它(myreverse'(1 2 3))lis

我在lisp中编写了一个列表反转函数,我想对它进行测试,但我遇到了一个错误,无法解决它 函数和调用如下:

    (defun myreverse (list)
    (cond((null list) nil))
    (cons (myreverse(cdr list) (car list))))


    (myreverse '(1 2 3))

任何帮助都将不胜感激

当您
defun
myreverse
时,参数是
(list)
,因此当您调用它
(myreverse'(1 2 3))
list
时会绑定到
(1 2 3)

由于列表不是空的,您突然执行
(myreverse'(2 3)1)
并将
列表绑定到
(2 3)
,但是
1
绑定到什么?您只有一个参数,因此调用无效,并保证出错

提示1:有一种方法可以生成可选参数:

(defun test (a &optional (b 0) (c 0))
  (+ a b c))

(test 10)     ; ==> 10
(test 10 1 2) ; ==> 13
Hint2:您需要构建一个列表,而不仅仅是传递一个裸元素。已通过的列表将是下一轮的末尾,直到添加每个元素为止

错误答案(或其中一个错误答案):

更好的答案是:

(defun reverse (list)
     (reverse-aux list nil))
(defun reverse-aux (list result)
     (cond ((null list) result)
           (t (reverse-aux (cdr list) (cons (car list) result)))))

这是我们用来与课程中“附加”的定义进行比较的基本示例,用于区分尾部递归。

错误是什么?您可能还希望格式化代码,以便更好地阅读。不,将所有表达式排列在第一列是不可读的。错误是“给MYREVERSE的参数太多”,很抱歉,我忘记将错误添加到我的问题中。嗯,您的代码中的函数
MYREVERSE
的参数太多。错误信息非常清楚。为什么不修它?我怎么能修它??
(defun reverse (list)
     (reverse-aux list nil))
(defun reverse-aux (list result)
     (cond ((null list) result)
           (t (reverse-aux (cdr list) (cons (car list) result)))))