【问题标题】:Iterative filtering odd numbers in list迭代过滤列表中的奇数
【发布时间】:2016-04-12 04:38:51
【问题描述】:

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

我什至发现了一些包含类似问题和解决方案的帖子,但我无法将它们用作帮助,因为在这些解决方案中,他们使用了“car”和“cdr”命令,而我们在我们的计划呢。怎么能做到这一点?我会这样开始:

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

【问题讨论】:

  • 那么你看过Scheme的哪一部分?例如,您看到firstrest 了吗?
  • 当然我见过firstrest...但即使使用这两个命令我也无法解决任务。
  • 那么使用您找到并喜欢的任何解决方案,只需将car 替换为first 并将cdr 替换为rest,因为它们是相同的(对于正确的列表)。
  • 先写一个“常规”递归版本,确保你的逻辑是合理的。然后通过添加累加器参数使其迭代(尾递归)。 (由于这是家庭作业,您可能需要“手动”执行递归,而不是将其委托给归约函数。)如果您需要一本好书,SICP 是available online,并且很好地解释了这一点。
  • @uselpa:感谢您的回答。也许我应该提到我和我的班级都是初学者。因为不知道firstcarrestcrd 是相同的,所以我真的不想问愚蠢的问题。

标签: list filter numbers scheme iteration


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    好吧,在没有carcdr 访问器的情况下,您唯一的其他选择是使用来自SRFI1reduce

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

    但是, reduce 很可能不会是迭代的。 Left 通常是reduce。虽然它会以相反的顺序构建结果,但是您可以使用相同的方法在另一遍中迭代地反转列表,而根本不过滤(即使用始终成功的测试过程)。


    虽然firstrest 访问器可用,您需要做的就是自己写下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函数。

    【讨论】:

    • 不,他可以先使用(= car)然后休息(= cdr)
    猜你喜欢
    • 2011-08-05
    • 2017-05-30
    • 2021-08-02
    • 1970-01-01
    • 1970-01-01
    • 2020-12-23
    • 1970-01-01
    • 2015-11-07
    • 1970-01-01
    相关资源
    最近更新 更多