遍历嵌套列表中的每个元素

时间:2013-10-30 00:47:24

标签: scheme

我正在编写一个从嵌套列表中删除字符串的过程。 例如:

(define fubar '(("a" -1 7) (2 "c") ("d") (-2)))
(remove strings fubar) should return '((-1 7) (2) () (-2)).

因为列表是嵌套的,所以你不能简单地cdr列表,你需要一种方法来按顺序单独挑选每个列表的每个元素,并检查是否有字符串。关于如何去做的任何想法?

2 个答案:

答案 0 :(得分:2)

遍历列表列表的解决方案遵循一个众所周知的解决方案模板,我将为您提供一般结构,因此您可以填写空白:如果您找到解决方案会更好用你自己的方式!

(define (remove-strings lst)
  (cond (<???> <???>) ; if the list is empty, return the empty list
        ((not (pair? <???>)) ; if the current element is not a list
         (if (string? <???>) ; if the current element is a string
             (remove-strings <???>) ; simply advance recursion over cdr (*)
             (cons <???>                 ; else keep the current element
                  (remove-strings <???>)))) ; advance recursion over cdr
        (else                         ; otherwise it's a list of lists
         (cons (remove-strings <???>)     ; advance recursion over car
               (remove-strings <???>))))) ; advance recursion over cdr

请注意,在(*)中,我们通过在构造新列表的过程中忽略它们来“删除”我们找到的所有字符串,并且在下一行中,如果它不是字符串,那么我们保留元素同时构建输出列表。以上内容适用于任意嵌套列表。

答案 1 :(得分:0)

这是一个让你入门的骨架,树递归的技巧是汽车上的重复和cdr如果汽车本身就是一个列表

(define (remove-strings fubar)
 (cond ((null? fubar) ...)
       ((pair? (car fubar)) 
        (cons (... (car fubar)) (... (cdr fubar))
       (else ...)))