CS61A_hw07

发布时间 2023-04-19 19:05:32作者: 哎呦_不想学习哟~

 

#lang sicp

(define (unique s)
  (if (null? s)
      nil
      (cons (car s) (unique (filter (lambfa (x)
                                            (not (eq? x (car s))))
                                    (cdr s)))
      )
  )
)

这是一个Scheme函数,名为unique,它接受一个参数s,并返回一个去除s中重复元素后的新列表。

函数体的主要部分是递归的,它使用filter函数从列表s中过滤出不等于s的第一个元素的其余元素,并将它们传递给unique函数,直到列表s为空,此时返回空列表。

具体来说,这个函数做了以下几件事:

  1. 如果列表s为空,返回空列表。
  2. 否则,使用car函数获取列表s的第一个元素,并将其与由unique递归调用返回的不包含列表中第一个元素的重复元素的新列表连接起来。
  3. 在递归调用unique时,使用filter函数和一个lambda表达式来过滤掉列表s中不等于s的第一个元素的其余元素,以便构建新列表。
(lambda (x) (not (eq? x (car s))))

它接受一个参数x,并返回一个布尔值,表示参数x是否等于s的第一个元素。具体来说,该lambda表达式做了以下几件事情:

  1. 使用car函数获取s的第一个元素,并将其与参数x进行比较。
  2. 如果它们相等,则返回#f,表示参数xs的第一个元素相同。
  3. 否则,返回#t,表示参数xs的第一个元素不同。

这个lambda表达式的作用是在过滤器函数中使用,它用于测试序列中的每个元素,以查看是否应该包含在结果序列中。在本例中,它用于过滤掉与列表s的第一个元素相同的元素。

filter

(filter <pred> <lst>)

Returns a list consisting of only the elements of lst that return true when called on pred (a one-argument procedure).