方案流问题partSums

时间:2011-06-26 14:58:18

标签: stream scheme

本周我做了新的功课,我应该编写一个函数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))))))

我还有函数headtailcons-stream,它们是carcdrcons用于流。

任何人都可以帮我完成这个partSums吗?

提前致谢

bearzk

3 个答案:

答案 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)