【发布时间】:2012-02-25 07:35:45
【问题描述】:
如何在嵌套列表中搜索某个数字?
例如,列表是:
((1 2) (2 3) (3 4) (3 5) (4 5))
我正在寻找 1。
预期输出:
(1 2)
因为 1 在子列表中 (1 2)。
【问题讨论】:
标签: scheme
如何在嵌套列表中搜索某个数字?
例如,列表是:
((1 2) (2 3) (3 4) (3 5) (4 5))
我正在寻找 1。
预期输出:
(1 2)
因为 1 在子列表中 (1 2)。
【问题讨论】:
标签: scheme
首先创建函数来展平列表。像这样的:
> (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)
【讨论】:
扁平化不是我喜欢的方法,但这并不意味着它不正确。这是另一种选择:
(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 和汽车中获取值。
【讨论】:
使用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
【讨论】: