搜索方案中的嵌套列表以查找数字

时间:2012-02-25 07:35:45

标签: scheme

如何搜索嵌套列表以查找特定数字?

例如,列表是:

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

我正在寻找1.

预期产出:

(1 2)

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

3 个答案:

答案 0 :(得分: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个参数,但是过滤函数只需要一个参数的函数,所以我们用这样的方式重写函数:

(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 :(得分:0)

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

    (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和汽车中获取值。

答案 2 :(得分:0)

使用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