如何搜索嵌套列表以查找特定数字?
例如,列表是:
((1 2) (2 3) (3 4) (3 5) (4 5))
我正在寻找1.
预期产出:
(1 2)
因为1在子列表中(1 2)。
答案 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