本周我做了新的功课,我应该编写一个函数partSums
,它可以添加原始流中的元素来构建新的流,如:
(element0,element0+element1,element0+element1+element2...)
,结果应该在开头有一个0
。
在这个例子中,我假设我们有一个名为integers
的函数来生成类似于Haskell [1..]
的流,所以使用它上面的partSums
应该如下所示:
(partSums integers)
> '(1, 3, 6, 10, 15...)
在我的理解中,就像这样:
1 2 3 4 5 6 7 8..
1 2 3 4 5 6 7..
1 2 3 4 5 6..
1 2 3 4 5..
1 2 3 4..
1 2 .
+ .
1 3 6 10 15 21 .....
添加我已完成的2个流:
(define (add-streams s1 s2)
(cond ((empty-stream? s1) s2)
((empty-stream? s2) s1)
(else (cons-stream
(+ (head s1)(head s2))
(add-streams (tail s1) (tail s2))))))
我还有函数head
,tail
,cons-stream
,它们是car
,cdr
,cons
用于流。
任何人都可以帮我完成这个partSums
吗?
提前致谢
bearzk
答案 0 :(得分:1)
HtDP-bot说:
答案 1 :(得分:0)
您的方法似乎是创建一堆转移的流并将其添加。如果您知道要采用多少元素,这可能会有用,但如果元素数量不确定,那么当然不能创建无限数量的这些流!
另一种方法是维护您在每个点添加的流列表,称之为current-streams
,从(list integers)
开始。然后在(cons integers current-streams)
的每一步中,使用(apply + (map head current-streams))
获取下一个部分和,并在current-streams
更改为(map tail current-streams)
的情况下递归。这样您只需添加系列,因为您确实需要它们,而不是尝试在前面创建无限数量的流。但这是一种资源密集型方法,因为您需要跟踪的流的数量将继续增长和增长。
如果您可以总结一定数量的流(理想情况下是两个,使用您编写的函数!)来获得您想要的输出,那将是很好的。请注意,在输出的每一步中,上一步都有你需要为你计算的大部分部分和...如果你能找到一些使用流来利用它的方法。尝试在已经定义的partSums
序列的帮助下写下integers
序列的连续元素之间的递归关系,并查看是否会导致您采用可能不同的流方法。 ..
答案 2 :(得分:0)
(define (partial-sums s)
(let loop ((current 0) (s s))
(if (empty-stream? s) '()
(let ((v (+ current (head s))))
(cons-stream v (loop v (tail s)))))))
这个
(partial-sums '(1 2 3 4 5 6 7 8 9))
打印
(1 3 6 10 15 21 28 36 45)
定义后
(define empty-stream? null?)
(define tail cdr)
(define head car)
(define cons-stream cons)