【问题标题】:SICP- defining filter using accumulation使用累积的 SICP 定义过滤器
【发布时间】:2020-05-14 08:00:59
【问题描述】:

所以我需要使用累积来定义过滤器,我需要完成这个定义:

(define filter
          (lambda (predicate sequence)
              (accumulate ???? null sequence)))

我填写:

(lambda (arg result)
         (cons
          (cond ((null? arg) null)
                ((predicate arg) arg)
                (else (filter predicate (cdr sequence))
          (result))

但是当我在 (list 1 2 3 4) 上测试它时,我得到了一些奇怪的东西:'((2 ((4) 4) 4) 2 (2 ((4) 4) 4) 4)。

谁能帮帮我?我做错了什么?

非常感谢!

【问题讨论】:

    标签: list lambda filter lisp


    【解决方案1】:

    鉴于accumulate的SICP定义:

    (define (accumulate op initial sequence) 
       (if (null? sequence) 
           initial 
           (op (car sequence) 
               (accumulate op initial (cdr sequence))))) 
    

    然后使用两个参数调用opsequence 的有趣元素和过滤sequence 其余部分的结果,如果没有更多列表,则为initial。你应该使用accumulate作为:

    (define filter
      (λ (predicate sequence)
        (accumulate ???? null sequence)))
    

    所以,如果???? 想要根据predicate 进行过滤,它应该:

    • 如果predicate在列表的有趣元素上为真,则返回一个列表,其car是该元素,其cdr是过滤列表其余部分的结果;
    • 如果predicate 在列表中感兴趣的元素上为假,则返回过滤列表其余部分的结果。

    你写????应该足够了。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-03-19
      • 1970-01-01
      • 2011-09-28
      • 2020-03-16
      • 2020-10-17
      • 2018-09-17
      相关资源
      最近更新 更多