Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/extjs/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Recursion 我试图使用LISP基本函数和lambda函数的递归来添加一个数字列表_Recursion_Lambda_Lisp - Fatal编程技术网

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)