【问题标题】:I am trying to to add a list of numbers using LISP basic functions and recursion of a lambda function我正在尝试使用 LISP 基本函数和 lambda 函数的递归添加数字列表
【发布时间】:2017-04-19 14:32:15
【问题描述】:

到目前为止,这是我的代码。

(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)))))))))

它返回一个列表 ( 3 7 ) *这是我的踪迹*

``>(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)``

我已经尝试过这样做(更新代码)...

(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))))))))))

让程序将递归列表添加到cons 列表但无济于事, 这是更新代码的跟踪

>(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

谁能带领我走向一个好的有序的方向?

【问题讨论】:

  • 您的代码看起来没有正确缩进。你可能想改进它。

标签: recursion lambda lisp


【解决方案1】:

reduce 有很多功能,但没有关键字它为(+ 5 (+ 4 (+ 3 (+ 2 1)))) 提供(reduce #'+ '(1 2 3 4 5))。没有任何cons。这是来自 Scheme 的一个更简单的版本,称为 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 模仿这个,如果你将initial-value 作为关键字参数传递。 reduce 替换了一大堆类似的功能,实现起来并不简单。例如。它对一个空列表和一个没有initial-value 的元素列表的表现非常特别。

【讨论】:

    猜你喜欢
    • 2016-01-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多