我正在编写一个从嵌套列表中删除字符串的过程。 例如:
(define fubar '(("a" -1 7) (2 "c") ("d") (-2)))
(remove strings fubar) should return '((-1 7) (2) () (-2)).
因为列表是嵌套的,所以你不能简单地cdr
列表,你需要一种方法来按顺序单独挑选每个列表的每个元素,并检查是否有字符串。关于如何去做的任何想法?
答案 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 ...)))