在scheme中的嵌套列表中搜索以查找数字

在scheme中的嵌套列表中搜索以查找数字,scheme,Scheme,如何在嵌套列表中搜索以找到某个数字 例如,列表为: ((1 2) (2 3) (3 4) (3 5) (4 5)) 我在找1 预期产出: (1 2) 因为1在子列表(12)中。首先创建函数以展平列表。大概是这样的: > (flatten '((8) 4 ((7 4) 5) ((())) (((6))) 7 2 ())) (8 4 7 4 5 6 7 2) 然后在普通列表中搜索您的号码 这个问题看起来像家庭作业,所以试着自己开发这个函数,如果你做不到,把你的代码贴在这里,我会尽力帮助你

如何在嵌套列表中搜索以找到某个数字

例如,列表为:

((1 2) (2 3) (3 4) (3 5) (4 5))
我在找1

预期产出:

(1 2)

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

首先创建函数以展平列表。大概是这样的:

> (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))
换句话说,我们需要根据某种条件过滤我们的配对列表。在这项计划中有一个共同点。它需要一个列表来过滤,并通过函数来决定是否在结果列表中包含列表元素

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

(define (check-pair num p)
  (cond 
    [(= (first p) num) #t]
    [else #f]))
(member 1 '(1 2)) => #t
(member 1 '(3 4)) => #f
此函数用于获取一对(列表元素)、编号并决定是否将此对包含到结果列表中。此函数有2个参数,但filter函数只需要一个参数的函数,因此我们以如下方式重写函数:

(define (check-pair num)
  (lambda (p)
    (cond 
      [(= (first p) num) #t]
      [else #f])))
我已经创建了生成另一个函数的函数。是的

因此,我们必须创建我们的解决方案:

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

扁平化不是我喜欢的方法,但这并不意味着它是错误的。这里有一个替代方案:

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

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

使用
查找
从满足以下条件的列表中选择成员:

(find contains-1? '((1 2)(2 3)(3 4)(5 6)))
<如何执行<代码>包含-1?<代码>提示:考虑<代码>成员< /代码>函数:

(define (check-pair num p)
  (cond 
    [(= (first p) num) #t]
    [else #f]))
(member 1 '(1 2)) => #t
(member 1 '(3 4)) => #f

我有一个函数可以展平它,但是如果我展平这个函数,我将如何找出这对(12)是什么,因为这是我想在新列表中存储的。好的,请描述函数的输入和输出参数,并给出一些用法的示例。(lst s)其中lst将是((12)(23)(34)(35)(45))s将是1,我想简单地找到子列表,它将有1,因为它是(12),我想把它存储在新的列表中,好的,我理解展平部分。我做了展平函数并在上面的列表上运行它,上面的列表如下:((1 2)(2 3)(3 4)(3 5)(4 5)),我得到了下面的列表:(1 2 3 3 3 4 4 5),现在如果我要搜索1,我将如何存储该数字和它旁边的数字