Function lisp自主开发的递归逆函数
我在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
(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)))))