迭代过滤列表中的奇数

时间:2016-01-07 17:05:49

标签: list filter numbers scheme iteration

这是我必须解决的任务:编写一个迭代函数,它接收带有数字的列表并创建一个新列表,该列表仅包含接收列表中的偶数。

我甚至发现了一些有类似问题和解决方案的帖子,但我不能将它们用作帮助,因为在这些解决方案中他们使用的是“car”和“cdr”命令,我们在安排。怎么办呢?我会这样开始:

(define filter-odds
  (lambda(x)
    (if (odd? x)
      ...)

2 个答案:

答案 0 :(得分:0)

好吧,如果没有car / cdr个访问者,您唯一的另一个选择就是使用SRFI1中的reduce

(define filter-odds
  (lambda (lst)
    (reduce-right
      (lambda (e     ; list's element
               acc)  ; accumulated results from the right
         (if (odd? e)
           ....      ; combine e and the results-so-far
           .... ))   ; ignore e
      '()
      lst )))

但是,正确减少最有可能不会迭代。通常是减少。它会以相反的顺序构建结果,但是您可以使用相同的方法在另一个传递中迭代地反转列表,而不进行任何过滤(即使用始终成功的测试过程)。

虽然可以使用first / rest访问者,但您需要做的就是自己写下reduce的实现,然后将保险丝写入上面的定义:

(define reduce
   (lambda (f acc ls)
      (if (null? ls)
         acc
         (reduce f (f acc (first ls)) .....))))

换句话说,只需按照上面的code skeleton进行操作,然后将对f的调用替换为对odd?或其他内容的一些检查,以获取filter-odd?-reversed;然后找出要使用的f以定义reverse-list函数。

答案 1 :(得分:0)

可怕的疏忽:这里没有人提到How To Design Programs。这种程序正好在HtDP的路径中间。具体来说,这是第9.3节“#34;使用列表编程”中列表模板的完全直接应用。"也许你的班级已经在使用HtDP了?