使用过滤器或折叠球拍遍历嵌套列表

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 - 使用过滤数据获取嵌套关系

如何以角度动态创建 n 级嵌套展开/折叠组件

TypeError:使用RegEx过滤嵌套字符串列表时的预期字符串或类字节对象

在 AWS Amplify GraphQL DynamoDB 中按另一个表的字段(也称为交叉表或嵌套过滤)过滤列表查询

jQuery mobile折叠列表视图,搜索不起作用

嵌套的 wordpress 术语列表 - 过滤器