方案-在等列表的列表中递归加数字

时间:2018-12-02 18:41:23

标签: scheme racket

我遇到一个问题,我需要将每个列表的第二个数字相加。例如,假设我有一个如下列表的列表,

(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。但是,该列表可以有多个子列表。但是列表中的第二项可以是数字或列表。如果是列表,那么我们需要更深入地研究该列表,直到获得一个数字。

谢谢!

1 个答案:

答案 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文件夹`。