我试图用给定的无限流替换给定的符号表达式。例如,考虑2的无限乘法流:
(define doubles
(cons-stream 1 (s-map (lambda (x) (* x 2)) doubles)))并假设定义流的函数是正确的。
现在,当我调用我的方法来替换符号表达式时,我得到以下信息:
(replace '((a . b) . (c . d)) doubles)
--> ((1 . 1) 1 . 1)请注意,我的递归调用只将表达式替换为无限流的“开始”,即该方法无法跟踪何时使用流的“剩余”部分。
正确的输出应该是:
->(1。2) 4.8)
我目前的代码如下;
(define (replace s str) (cond ((null? s) '())
((atom? s) (head str))
(else (cons (replace (car s) str)
(replace (cdr s) str)))))那么,我的问题将是:如何在调用递归方法的同时穿越流?提前谢谢。
编辑:
我试图使用另一种方法来计算剩余的流:
(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))))这将返回一个新的输出:
---> ((4 . 4) 4 . 4)发布于 2014-11-30 15:05:21
您需要变异str,否则它将继续返回第一个元素。例如,使用set!语句:
(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)))))))然后
> (replace '((a . b) . (c . d)) doubles)
'((1 . 2) 4 . 8)也见我对你的previous question的评论。
另外,请注意,您的输入结构中没有null,所以测试永远不会产生真结果。
编辑这里有一个没有set!的版本,在标准球拍中,应该很容易移植到R5RS:
(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)https://stackoverflow.com/questions/27214508
复制相似问题