在方案中添加嵌套列表的总和
Adding The Sum Of Nested List In Scheme
我正在使用方案。我在查找某个列表的总和时没有问题,但是当列表中有一个列表或 AKA 嵌套列表时,我在添加总和时遇到了很多麻烦。
(define (my-summation li)
(if (null? li)
0
((if (list? (car li)) (my-summation (car li))
(+ (car li) (my-summation (cdr li)))))))
这是我的输入,这是错误的结果。 Scheme是我的弱项,因为它涉及递归,但我似乎找不到问题所在。
> (my-summation '(6 3 -2 5 '(4 2 -3) 4 ))
function call: expected a function after the open parenthesis, but received -3
它在括号中,您在 if
周围有一个额外的集合。此外,当列表在引用列表中时,您不需要引用列表。 (list? (car li))
的情况不正确,它应该对元素和列表的其余部分求和。
(define (my-summation li)
(if (null? li)
0
(if (list? (car li))
(+ (my-summation (car li)) (my-summation (cdr li)))
(+ (car li) (my-summation (cdr li))))))
(my-summation '(6 3 -2 5 (4 2 -3) 4))
总和为 19
。
另一种解决方案:
(define (sum-list xs)
(define (loop sum-so-far xs)
(cond
[(null? xs) sum-so-far] ; no-more-elements
[(pair? (car xs)) (loop (+ sum-so-far (sum-list (car xs))) ; the first element is a sublist
(cdr xs))] ; so sum-list computes its sum
[else (loop (+ sum-so-far (car xs)) ; the first element is a number
(cdr xs))])) ; so it is added directly
(loop 0 xs))
(sum-list '(6 3 -2 5 (4 2 -3) 4)) ; note: no quote in the middle
; ==> 19
我正在使用方案。我在查找某个列表的总和时没有问题,但是当列表中有一个列表或 AKA 嵌套列表时,我在添加总和时遇到了很多麻烦。
(define (my-summation li)
(if (null? li)
0
((if (list? (car li)) (my-summation (car li))
(+ (car li) (my-summation (cdr li)))))))
这是我的输入,这是错误的结果。 Scheme是我的弱项,因为它涉及递归,但我似乎找不到问题所在。
> (my-summation '(6 3 -2 5 '(4 2 -3) 4 ))
function call: expected a function after the open parenthesis, but received -3
它在括号中,您在 if
周围有一个额外的集合。此外,当列表在引用列表中时,您不需要引用列表。 (list? (car li))
的情况不正确,它应该对元素和列表的其余部分求和。
(define (my-summation li)
(if (null? li)
0
(if (list? (car li))
(+ (my-summation (car li)) (my-summation (cdr li)))
(+ (car li) (my-summation (cdr li))))))
(my-summation '(6 3 -2 5 (4 2 -3) 4))
总和为 19
。
另一种解决方案:
(define (sum-list xs)
(define (loop sum-so-far xs)
(cond
[(null? xs) sum-so-far] ; no-more-elements
[(pair? (car xs)) (loop (+ sum-so-far (sum-list (car xs))) ; the first element is a sublist
(cdr xs))] ; so sum-list computes its sum
[else (loop (+ sum-so-far (car xs)) ; the first element is a number
(cdr xs))])) ; so it is added directly
(loop 0 xs))
(sum-list '(6 3 -2 5 (4 2 -3) 4)) ; note: no quote in the middle
; ==> 19