List 列表中奇数的迭代过滤

List 列表中奇数的迭代过滤,list,filter,numbers,scheme,iteration,List,Filter,Numbers,Scheme,Iteration,这里有一个我必须解决的任务:编写一个迭代函数,它接收一个带有数字的列表并创建一个新列表,该列表只包含来自接收列表的偶数 我甚至发现了一些帖子有类似的问题和解决方案,但我无法将它们用作帮助,因为在这些解决方案中,他们使用了car和cdr命令,这在我们的日程安排中还没有。你怎么能做到这一点?我想这样开始: (define filter-odds (lambda(x) (if (odd? x) ...) 嗯,在没有汽车⁄cdr存取器的情况下,您唯一的其他选择是使用reduce

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

我甚至发现了一些帖子有类似的问题和解决方案,但我无法将它们用作帮助,因为在这些解决方案中,他们使用了car和cdr命令,这在我们的日程安排中还没有。你怎么能做到这一点?我想这样开始:

(define filter-odds
  (lambda(x)
    (if (odd? x)
      ...)
嗯,在没有汽车⁄cdr存取器的情况下,您唯一的其他选择是使用reduce from:

但是,右reduce很可能不会是迭代的。左减通常是。它将以相反的顺序生成结果,但是您可以在另一个过程中使用相同的方法迭代地反转列表,而不进行任何过滤,即使用始终成功的测试过程

但是,有了第一个⁄rest访问器,您只需写下reduce自己的实现,然后将其融合到上述定义中:

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

换句话说,只需按照上面的步骤添加并用一些奇数检查替换对f的调用?或者别的什么,让过滤器变奇数?-反转;然后找出要使用的f,以便定义反向列表函数。

可怕的疏忽:这里没有人提到。这种节目正好在HtDP的途中。具体来说,这是第9.3节“列表编程”中列表模板的一个完全直接的应用。也许你们班已经在使用HtDP了?

那个么你们看到了方案的哪一部分?比如说,你看到first和rest了吗?当然我看到first和rest了。。。但是,即使使用这两个命令,我也无法解决这个问题。那么,使用您发现并喜欢的任何解决方案,简单地用first替换car,用rest替换cdr,因为它们对于正确的列表是相同的。首先编写一个常规的递归版本,以确保您的逻辑正确。然后通过添加累加器参数使其具有迭代尾部递归性。由于这是一个家庭作业,您可能需要手动执行递归,而不是将其委托给缩减函数。如果你需要一本好书,SICP会很好地解释这一点。@uselpa:谢谢你的回答。也许我应该提到我和我的班级都是初学者。我真的不想问愚蠢的问题,因为我不知道first和car或rest与crd是一样的。不,他被允许使用first=car和rest=cdr
(define reduce
   (lambda (f acc ls)
      (if (null? ls)
         acc
         (reduce f (f acc (first ls)) .....))))