Recursion 我试图使用LISP基本函数和lambda函数的递归来添加一个数字列表
这是到目前为止我的代码Recursion 我试图使用LISP基本函数和lambda函数的递归来添加一个数字列表,recursion,lambda,lisp,Recursion,Lambda,Lisp,这是到目前为止我的代码 (defun myReduce (foo L) (if(eq L nil) nil (if(eq (car(cdr L)) nil) nil (cons (funcall foo(car L) (car(cdr L))) (myReduce foo (cdr(cdr L))))))))) 它返回一个列表(37) *这是我的追踪*
(defun myReduce (foo L)
(if(eq L nil)
nil
(if(eq (car(cdr L)) nil)
nil
(cons (funcall foo(car L) (car(cdr L)))
(myReduce foo (cdr(cdr L)))))))))
它返回一个列表(37)
*这是我的追踪*
``>(trace myReduce)
(MYREDUCE)
>(myReduce (lambda (x y) (+ x y)) '(1 2 3 4 5))
1> (MYREDUCE (SYSTEM:LAMBDA-CLOSURE () () () (X Y) (+ X Y))
(1 2 3 4 5))
2> (MYREDUCE (SYSTEM:LAMBDA-CLOSURE () () () (X Y) (+ X Y))
(3 4 5))
3> (MYREDUCE (SYSTEM:LAMBDA-CLOSURE () () () (X Y) (+ X Y)) (5))
<3 (MYREDUCE NIL)
<2 (MYREDUCE (7))
<1 (MYREDUCE (3 7))
(3 7)``
要让程序将递归列表添加到cons
列表,但没有效果,
这是更新代码的跟踪信息
>(跟踪myReduce)
(MYREDUCE)
>(myReduce(lambda(xy)(+xy))'(123445))
1> (MYREDUCE(系统:LAMBDA-CLOSURE()(xy)(+xy))
(1 2 3 4 5))
2> (MYREDUCE(系统:LAMBDA-CLOSURE()(xy)(+xy))
(3 4 5))
3> (MYREDUCE(系统:LAMBDA-CLOSURE()(xy)(+xy))(5))
reduce
有很多功能,但是没有关键字,它为提供了(+5(+4(+3(+2 1))
(reduce#'+'(1 2 3 4 5))
。没有任何缺点。下面是一个名为foldl
的简单方案:
(defun foldl (fun initial-value lst)
(labels ((helper (init lst)
(if lst
(helper (funcall fun (car lst) init) (cdr lst))
init)))
(helper initial-value lst)))
(foldl #'cons '() '(1 2 3))
; ==> (3 2 1)
reduce
如果将初始值
作为关键字参数传递,则会模拟此操作reduce
取代了大量类似的函数,实现起来也不是那么简单。它在一个空列表和一个没有初始值的元素列表中的行为非常特殊 您的代码看起来没有正确缩进。你可能想改进一下。
>(trace myReduce)
(MYREDUCE)
>(myReduce (lambda (x y) (+ x y)) '(1 2 3 4 5))
1> (MYREDUCE (SYSTEM:LAMBDA-CLOSURE () () () (X Y) (+ X Y))
(1 2 3 4 5))
2> (MYREDUCE (SYSTEM:LAMBDA-CLOSURE () () () (X Y) (+ X Y))
(3 4 5))
3> (MYREDUCE (SYSTEM:LAMBDA-CLOSURE () () () (X Y) (+ X Y)) (5))
<3 (MYREDUCE NIL)
Error: TYPE-ERROR :DATUM (7) :EXPECTED-TYPE NUMBER
Fast links are on: do (si::use-fast-links nil) for debugging
Signalled by +.
TYPE-ERROR :DATUM (7) :EXPECTED-TYPE NUMBER
(defun foldl (fun initial-value lst)
(labels ((helper (init lst)
(if lst
(helper (funcall fun (car lst) init) (cdr lst))
init)))
(helper initial-value lst)))
(foldl #'cons '() '(1 2 3))
; ==> (3 2 1)