【问题标题】:scheme stream problem partSums方案流问题 partSums
【发布时间】:2011-06-27 16:33:36
【问题描述】:

这周我有新的作业要做,我应该写一个函数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

提前致谢

熊熊

【问题讨论】:

    标签: stream scheme


    【解决方案1】:

    HtDP-bot 说:

    • 你能写下这个功能的目的声明和合同吗?它消耗什么,生产什么?
    • 你能把你的例子翻译成测试用例吗?写一个表达式,以及它应该产生的值。使用“相等?”比较它们

    【讨论】:

      【解决方案2】:

      您的方法似乎是创建一堆移位的流并将它们相加。如果您知道要获取多少元素,这可能会起作用,但如果元素的数量是不确定的,那么您当然不能创建无限数量的这些流!

      另一种方法是维护您在每个点添加的流的列表,称为current-streams,以(list integers) 开头。然后在每一步你(cons integers current-streams),用(apply + (map head current-streams)) 获得下一个部分和,并用current-streams 递归更改为(map tail current-streams)。这样,您只添加真正需要的系列,而不是尝试预先创建无限数量的流。但这是一种资源密集型方法,因为您需要跟踪的流数量会不断增长。

      如果您可以总结固定数量的流(最好是两个,使用您编写的函数!)来获得您想要的输出,那就太好了。请注意,在输出的每一步中,上一步都有您需要为您计算的大部分部分总和......如果您能找到某种使用流的方法来利用它。借助您已经定义的 integers 序列,尝试写下 partSums 序列的连续元素之间的递归关系,看看这是否会导致您采用可能不同的流式处理方法...

      【讨论】:

        【解决方案3】:
        (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)
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-05-17
          • 2010-11-08
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多