嵌套列表 LISP 中数字元素的总和

Sum of numeric elements in a nested list LISP

Return 使用 LISP 的嵌套列表中数字元素的 SUM。如果没有数字元素 return 一个空的 list/NIL

示例:

         (6 3 -2 5 (4 2 -3) 4) should return 19
     

         (1 2 3 (-4 5) a b c) should return 7

让别人帮你做作业几乎从来都不是学习任何东西的好方法。

但这里有一个答案,它是用 Lisp (Racket) 编写的,它确实展示了您应该如何解决这个问题,而且(我认为)还展示了一些思考此类问题的好方法。 .. 但你几乎肯定不能剪切和粘贴。

请注意,这与给定的要求不太一致:应该 return 一个列表中没有数字的非数字值。这打破了这样的递归算法,因为空列表是一个没有数字的列表。所以这做了一些更明智的事情。让这个答案实现要求作为练习留给学生。

(define (sum-nested-list l)
  (let sum-nested-list-loop ([thing l]
                             [running-total 0])
    (match thing
      ['()
       ;; We're done if we've run out of list
       running-total]
      [(list* (? number? x) r)
       ;; A list whose first element is a number: add it to the running total
       ;; and carry on on the rest of the list
       (sum-nested-list-loop r (+ running-total x))]
      [(list* (? list? x) r)
       ;; A list whose first element is a nested list: recurse into the
       ;; nested list
       (sum-nested-list-loop r (sum-nested-list-loop x running-total))]
      [(list* _ r)
       ;; A list whose first element is not a number or a nested list:
       ;; carry on on the rest of the list
       (sum-nested-list-loop r running-total)]
      [_
       ;; Not a list at all: explode
       (error 'sum-numeric-list "what?")])))
(defun flat-sum (tree)
  (let ((count 0))
    (tree-equal tree tree :test (lambda (left right)
                                  (if (numberp left)
                                    (incf count left) t)))
    count))

1> (flat-sum '(1 2 3 (-4 5) a b c))
7