使用过滤器或折叠球拍遍历嵌套列表
Posted
技术标签:
【中文标题】使用过滤器或折叠球拍遍历嵌套列表【英文标题】:Iterating through a nested list using filter or fold Racket 【发布时间】:2021-12-25 12:27:04 【问题描述】:我需要使用列表迭代和过滤来遍历 Racket 中包含子列表的列表,其中一个列表是嵌套列表,我尝试使用“list?
”和“car
”在内部进行迭代,但当然那仅适用于子列表的第一个值。
有没有办法使用列表迭代和过滤来遍历整个嵌套列表?
(define (count-evens lst)
(length
(filter
(lambda (x)
(cond
[(and (list? x)
(and (number? (car x))
(eq? (modulo (car x) 2) 0)))
#t]
[(and (number? x)
(eq? (modulo x 2) 0))
#t]
[else
#f]))
lst)))
(count-evens '(1 2 5 4 (8 4 (b (10 3 3))) 3))
=> 3
Should return => 5
我会使用递归函数来执行此操作,但分配不允许这样做。
【问题讨论】:
您实际上是在要求展平任意嵌套的列表而无需递归。我不确定我是否能看到 atm 的方式。 我将只使用带有递归的 flatten 函数,因为我看不到没有递归的任何其他方法。 如果要使用 flatten 函数,为什么还需要递归? 【参考方案1】:"...赋值不允许[递归函数]"
不确定该作业允许使用什么,但是 在过去我们使用堆栈处理递归数据结构...
(define (count-evens lst)
(define (lst-at stack) ;; (car stack) = index in deepest sub-list
;; produce list cursor within lst indexed by stack
(do ([stack (reverse stack) (cdr stack)]
[cursor (list lst) (list-tail (car cursor) (car stack))])
((null? stack) cursor)))
(do ([stack (list 0)
(cond
[(null? (lst-at stack))
(cdr stack)] ;; pop stack
[(pair? (car (lst-at stack)))
(cons 0 stack)] ;; push stack
[else ;; step through current (sub)list
(cons (+ 1 (car stack)) (cdr stack))])]
[count 0
(let ([item (car (lst-at stack))])
(if (and (number? item) (even? item)) (+ 1 count) count))])
((null? (lst-at stack)) count)))
> (count-evens '(1 2 5 4 (8 4 (b (10 3 3))) 3)) ;=>
5
【讨论】:
以上是关于使用过滤器或折叠球拍遍历嵌套列表的主要内容,如果未能解决你的问题,请参考以下文章
Laravel Eloquent - 使用过滤数据获取嵌套关系
TypeError:使用RegEx过滤嵌套字符串列表时的预期字符串或类字节对象