首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用无限流替换符号表达式

用无限流替换符号表达式
EN

Stack Overflow用户
提问于 2014-11-30 14:50:04
回答 1查看 160关注 0票数 1

我试图用给定的无限流替换给定的符号表达式。例如,考虑2的无限乘法流:

代码语言:javascript
复制
(define doubles
  (cons-stream 1 (s-map (lambda (x) (* x 2)) doubles)))

并假设定义流的函数是正确的。

现在,当我调用我的方法来替换符号表达式时,我得到以下信息:

代码语言:javascript
复制
(replace '((a . b) . (c . d)) doubles)
   --> ((1 . 1) 1 . 1)

请注意,我的递归调用只将表达式替换为无限流的“开始”,即该方法无法跟踪何时使用流的“剩余”部分。

正确的输出应该是:

->(1。2) 4.8)

我目前的代码如下;

代码语言:javascript
复制
(define (replace s str)   (cond ((null? s) '())
        ((atom? s) (head str))
        (else (cons (replace (car s) str)
                    (replace (cdr s) str)))))

那么,我的问题将是:如何在调用递归方法的同时穿越流?提前谢谢。

编辑:

我试图使用另一种方法来计算剩余的流:

代码语言:javascript
复制
(define (replace s str)
  (cond ((null? s) '())
        ((atom? s) (head str))
        (else (cons (replace (car s) (get-stream s str))
                    (replace (cdr s) (get-stream s str))))))

(define (get-stream s str)
  (cond ((null? s) '())
        ((atom? s) (tail str))
        (else (get-stream (cdr s) str))))

这将返回一个新的输出:

代码语言:javascript
复制
---> ((4 . 4) 4 . 4)
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-11-30 15:05:21

您需要变异str,否则它将继续返回第一个元素。例如,使用set!语句:

代码语言:javascript
复制
(define (replace s str)
  (let loop ((s s))
    (cond ((null? s) s)
          ((pair? s) (cons (loop (car s)) (loop (cdr s))))
          (else      (begin0 
                       (stream-first str)
                       (set! str (stream-rest str)))))))

然后

代码语言:javascript
复制
> (replace '((a . b) . (c . d)) doubles)
'((1 . 2) 4 . 8)

也见我对你的previous question的评论。

另外,请注意,您的输入结构中没有null,所以测试永远不会产生真结果。

编辑这里有一个没有set!的版本,在标准球拍中,应该很容易移植到R5RS:

代码语言:javascript
复制
(define (replace s str)
  (define-values (res _)
    (let loop ((s s) (str str))
      (cond ((null? s) (values s str))
            ((pair? s) (define-values (res1 str1) (loop (car s) str))
                       (define-values (res2 str2) (loop (cdr s) str1))
                       (values (cons res1 res2) str2))
            (else      (values (stream-first str) (stream-rest str))))))
  res)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27214508

复制
相关文章

相似问题

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