总结列表,其中元素本身是列​​表

时间:2018-03-19 20:31:33

标签: list recursion sum scheme fold

我无法在Scheme中解决问题,该问题对列表中的所有元素求和,其中所有元素本身都是列表。

我写了一个函数(polyAdd l1 l2),它接受​​两个列表并将它们加在一起。 例如,(polyAdd '(1 2) '(3 4 5))会给(4 6 5)

代码在这里:

(define (polyAdd l1 l2)
  (cond
    ((null? (and l1 l2))'())
    ((null? l1) (cons (+ 0 (car l2))(polyAdd l1 (cdr l2))))
    ((null? l2) (cons (+ 0 (car l1))(polyAdd l2 (cdr l1))))
    (else (cons (+ (car l1) (car l2))(polyAdd (cdr l1) (cdr l2))))))

现在我尝试编写一个函数(polyAddList l),它使用列表列表并使用我的polyAdd函数将它们添加到一起。例如,(polyAddList '((1 2)(3 4)(5 6 7)))会给(9 12 7),但我不知道应该如何实现。

有人能帮帮我吗?谢谢!

2 个答案:

答案 0 :(得分:0)

1)你能编写一个能够累加单个数字列表的函数吗?

2)该函数用什么操作将第一个元素与递归调用的结果组合在一起?

3)您是否有一个新操作可用于将第一个元素与递归调用的结果组合在一个数字列表列表中?

答案 1 :(得分:0)

因此,您为两个操作数+定义了A + B操作。

接下来,您要定义其扩展版本+/,以处理操作数的列表

+/ [A,B]  =  A + B 
+/ [A,B,C]  =  A + B + C 
+/ [A,B,C,D]  =  A + B + C + D

如果您已经拥有此功能,则可以使用该值

B + C + D  =  +/ [B,C,D]

计算最后两笔钱:

+/ [A,B,C]    =  A + B + C      =  A + ( +/ [B,C]   )
+/ [A,B,C,D]  =  A + B + C + D  =  A + ( +/ [B,C,D] )

一般来说,

+/ [A,B,C,D,...]  =  A + B + C + D + ...  =  A + ( +/ [B,C,D,...] )

+/ [A  ,        B,C,D,...] =
    A  +  ( +/ [B,C,D,...] )

这是一个结构法,是一个潜在的实现(&#34;结构&#34;,因为它遵循 list 数据类型的结构)。< / p>

现在,您可以将所有内容写下来作为有效的Scheme代码。

附录:如果您的序列由树数据类型表示(使用树的边缘作为序列),我们就写

+/    [A,B,C,...     ,        O,P,Q,...] =
 ( +/ [A,B,C,...] )  +  ( +/ [O,P,Q,...] )

作为一项法律,并使用 it 作为另一种实施的指南。