Схема - Рекурсивное добавление чисел в список из списка и т. Д. - PullRequest
0 голосов
/ 02 декабря 2018

У меня проблема с добавлением второго номера каждого списка.Например, предположим, у меня есть список списков, как показано ниже:

(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 голосов
/ 03 декабря 2018

Решение

(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

Я использовал обычные для lisp-функции atom? и every?.Поскольку and нельзя использовать в foldr, я определил my-add, чтобы сделать add a function which can be used in foldr`.

...