【问题标题】:search through nested list in scheme to find a number搜索方案中的嵌套列表以查找数字
【发布时间】:2012-02-25 07:35:45
【问题描述】:

如何在嵌套列表中搜索某个数字?

例如,列表是:

((1 2) (2 3) (3 4) (3 5) (4 5))

我正在寻找 1。

预期输出:

(1 2)

因为 1 在子列表中 (1 2)。

【问题讨论】:

    标签: scheme


    【解决方案1】:

    首先创建函数来展平列表。像这样的:

    > (flatten '((8) 4 ((7 4) 5) ((())) (((6))) 7 2 ()))
    (8 4 7 4 5 6 7 2)
    

    然后在普通列表中搜索你的号码。

    这个问题看起来像家庭作业,所以试着自己开发这个功能,如果你做不到 - 在这里发布你的代码,我会尽力帮助你。

    更新

    好的。据我了解,我们需要创建函数来获取对列表并返回另一个对列表,其中对的第一个元素等于某个数字。

    例如:

    (define data '((1 2)(2 3)(3 4)(3 5)(4 5)))
    (solution data 3)
    -> '((3 4) (3 5))
    
    (define data '((1 2)(2 3)(3 4)(3 5)(4 5)))
    (solution data 1)
    -> '((1 2))
    

    换句话说,我们需要根据某些条件过滤我们的配对列表。在方案中有一个function to filter list。它需要一个列表来过滤和函数来决定 - 在结果列表中是否包含列表元素。

    所以我们需要创建这样的函数:

    (define (check-pair num p)
      (cond 
        [(= (first p) num) #t]
        [else #f]))
    

    此函数获取一对(列表元素),编号并决定 - 是否将此对包含到结果列表中。这个函数有2个参数,但是filter函数要求函数只有一个参数,所以我们把函数改写成这样:

    (define (check-pair num)
      (lambda (p)
        (cond 
          [(= (first p) num) #t]
          [else #f])))
    

    我已经创建了产生另一个函数的函数。是currying

    所以,我们必须创建我们的解决方案:

    (define (check-pair num)
      (lambda (p)
        (cond 
          [(= (first p) num) #t]
          [else #f])))
    
    (define (solution list num)
      (local 
        ((define check-pair-by-num (check-pair num)))
        (filter check-pair-by-num list)))
    
    (define data '((1 2)(2 3)(3 4)(3 5)(4 5)))
    
    (solution data 1)
    

    【讨论】:

    • 我有将其展平的功能,但是如果我展平该功能,我将如何找出这对 (1 2) 是什么,因为这是我想将其存储在新列表中的内容。
    • 那么,请描述一下函数的in和out参数,并举例说明它的用法。
    • (lst s) 其中 lst 将是 ((1 2)(2 3)(3 4)(3 5)(4 5)) 而 s 将是 1 我想简单地找到子-list 自 (1 2) 以来将有 1,我想将其存储在新列表中
    • 好的,我了解扁平化部分。我制作了 flatten 函数并在上面的列表中运行它,如下所示:((1 2)(2 3)(3 4)(3 5)(4 5))),我得到以下列表:(1 2 2 3 3 4 3 5 4 5),现在如果我要通过这个搜索 1,我将如何存储该数字及其旁边的数字
    【解决方案2】:

    扁平化不是我喜欢的方法,但这并不意味着它不正确。这是另一种选择:

        (define (solve lst num)
          (cond 
            [(null? lst) null]
            [(cons? (first lst)) (solve (first lst) num)]
            [(member num lst) (cons lst (solve (rest lst) num))]
            [#t (solve (rest lst) num)]))
    

    这只是根据需要递归处理嵌套列表,所以我更喜欢它的风格。此外,对member 的调用可以替换为上面的check-pair,但如果您愿意,成员可以让您从 cdrs 和汽车中获取值。

    【讨论】:

      【解决方案3】:

      使用find 选择列表中满足条件的成员:

      (find contains-1? '((1 2)(2 3)(3 4)(5 6)))
      

      如何实现contains-1? 提示:考虑member 函数:

      (member 1 '(1 2)) => #t
      (member 1 '(3 4)) => #f
      

      【讨论】:

        猜你喜欢
        • 2017-01-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-02-12
        • 2013-11-26
        相关资源
        最近更新 更多