首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >无限流的累加器

无限流的累加器
EN

Stack Overflow用户
提问于 2019-03-08 15:41:02
回答 1查看 292关注 0票数 3

我正在尝试为无限流实现一个累加器。我写了下面的代码,但是它进入了一个无限循环,并且无法终止

代码语言:javascript
运行
复制
(define (stream-first stream) (car stream))
(define (stream-second stream) (car ((cdr stream))))
(define (stream-third stream) (car ((cdr ((cdr stream))))))
(define (stream-next stream) ((cdr stream)))


(define (stream-foldl func accum stream)
    (cond
         [(empty? stream) accum]
         [else (stream-foldl func (func (stream-first stream) accum) (stream-next stream))] ))

我写了几个测试来演示我想要实现的东西

代码语言:javascript
运行
复制
(define (natural-nums)
   (define (natural-nums-iter n)
   (thunk
   (cons n (natural-nums-iter (+ n 1)))))
   ((natural-nums-iter 0)))

(define x (stream-foldl cons empty (natural-nums)))
(check-equal? (stream-first x) empty)
(check-equal? (stream-second x) (list 0))
(check-equal? (stream-third x) (list 1 0))

(define y (stream-foldl (curry + 1) 10 (naturals)))
(check-equal? (stream-first y)  10)
(check-equal?  (stream-second y) 11)
(check-equal?  (stream-third y)  13)

下面是我的stream-foldl函数的一个跟踪

代码语言:javascript
运行
复制
>(stream-foldl
  #<procedure:cons>
  '()
  '(0 . #<procedure:...9/saccum.rkt:25:0>))
()>(stream-foldl
  #<procedure:cons>
  '(0)
  '(1 . #<procedure:...9/saccum.rkt:25:0>))
(0)>(stream-foldl
  #<procedure:cons>
  '(1 0)
  '(2 . #<procedure:...9/saccum.rkt:25:0>))
(1 0)>....

我认为我没有正确地设置一个基本情况,因此不会在递归调用中终止

EN

回答 1

Stack Overflow用户

发布于 2019-03-08 16:07:53

Fold应该查看流中的每个元素,然后根据这些元素生成结果。对于无限流,折叠不会终止也就不足为奇了(如何查看无限流中的每个元素呢?)

您可以执行的操作:

从无限流中产生一个有限流。stream-take可以用来实现这个目的。stream-take的示例实现

代码语言:javascript
运行
复制
;; Returns a stream containing the first n elements of stream s.
(define (stream-take n s)
  (cond ((zero? n) empty-stream)
        ((empty? s) (error "Stream is shorter than n")
        (else
          (delay (stream-first s)
                 (stream-take (- n 1) (stream-rest s)))))))
          ; Note: 'delay' is the same as the 'thunk' in your code.

然后,使用您的fold实现或stream-fold来折叠有限流。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55058735

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档