【问题标题】:stumped on list recursion被列表递归难住了
【发布时间】:2014-07-22 01:58:27
【问题描述】:

我遇到了涉及我的硬件列表的递归问题。硬件问题问如下:

"a (pair a b) is a (make-pair x y) 其中 x 是 a 型,y 是 b 型 (define-struct pair (a b))

按照此处所述编写函数分区:

partition : (a -> bool) (listof a) -> (pair (listof a) (listof a)) 将一个列表分成两个列表: - 一份测试结果为真的元素列表,以及 - 测试为假的元素的第二个列表。”

我想要做的是:

(define (partition test lst2)
  (cond
    [(null? lst2) null]
    [(boolean=? #f (first(map test lst2))) (remove (first lst2) lst2) (partition test (rest lst2)))]
    [else (cond (first lst2) (partition test (rest lst2)))]))

我意识到在这里使用 map 函数不是正确的方法,但我真的不知道如何保持第二种情况的递归(或其他情况,因为无论如何我有,它没有前进)。一旦我得到了真实的案例,我会在代码中的某个地方不使用错误的案例吗?还是我需要做一些完全不同的事情?我已经被这个问题难住了一段时间,如果有一些指导会很好!

【问题讨论】:

  • 我确实知道过滤器,但是当我使用它时,我得到: (list true true true) 并且我想要得到的是一个真实元素的列表。大约一个小时前我尝试过,但我不知道如何列出与真实陈述相对应的事物。
  • 没关系,我想通了。非常感谢您的帮助~非常感谢!
  • 这些问答条目不仅适合您个人,也适合以后可能阅读它们的任何人。您应该编辑您的问题并将您的解决方案放在那里以帮助其他有同样问题的人。 :)
  • @WillNess 不,不应将解决方案放入问题中,而应将其添加为答案。回答你自己的问题或接受那个答案并没有错;它有助于减少未回答问题的数量,并以与网站其他部分一致的方式让其他用户知道解决方案是什么(正如您所指出的)。

标签: scheme racket


【解决方案1】:

为了将来参考,Racket已经实现了一个返回两个列表值的partition 过程。例如:

(partition even? '(1 2 3 4 5 6 7 8 9 10))

=> '(2 4 6 8 10)
   '(1 3 5 7 9)

如果您对从头开始的实现感兴趣,filter 是您的最佳选择,正如 cmets 中所建议的那样。此实现将返回问题中定义的pair

(define (my-partition pred lst)
  (make-pair (filter pred lst)
             (filter-not pred lst)))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-13
    • 1970-01-01
    • 1970-01-01
    • 2012-02-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多