我遇到一个问题,我需要将每个列表的第二个数字相加。例如,假设我有一个如下列表的列表,
(list (list -4
(list (list -1 4) (list 1 7)))
(list 1 (list (list -2 5) (list 3 3)))
(list 3 12))
然后我的工作是加起来4 + 7 + 5 + 3 + 12 =31。但是,该列表可以有多个子列表。但是列表中的第二项可以是数字或列表。如果是列表,那么我们需要更深入地研究该列表,直到获得一个数字。
谢谢!
答案 0 :(得分:0)
解决方案
(define (atom? x)
(and (not (null? x))
(not (pair? x))))
(define (my-and x y)
(and x y))
(define (every? l)
(foldr my-and #t l))
(define (flat-list? l)
(cond ((null? l) #t)
((every? (map atom? l)) #t)
(else #f)))
(define (add-only-seconds l)
(define (l-sec-add l acc)
(cond ((null? l) acc)
((atom? l) acc)
((flat-list? l) (+ (second l) acc))
((list? l) (apply + acc (map (lambda (x) (l-sec-add x 0)) l)))))
(l-sec-add l 0))
示例测试
(define example-list (list (list -4
(list (list -1 4) (list 1 7)))
(list 1 (list (list -2 5) (list 3 3)))
(list 3 12)))
(add-only-seconds example-list) ;; 31
我使用了常见的典型函数atom?
和every?
。
由于and
无法在foldr
中使用,因此我定义了my-add
来制作add a function which can be used in
文件夹`。