2014-11-30 1 views
1

주어진 심볼 식을 주어진 무한 스트림으로 바꾸려고합니다. 예를 들어 2의 곱셈의 무한한 흐름을 고려 :심볼 식을 무한 스트림으로 바꾸기

(define doubles 
    (cons-stream 1 (s-map (lambda (x) (* x 2)) doubles))) 

및 스트림을 정의 내 기능이 올바른지 가정합니다. IE의 내 재귀 호출은 오직 무한 스트림의 '시작'내 표현을 대체, 여기

(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))))) 

제 질문은; 내 방법 recursivley 전화하는 동안 어떻게 스트림 건너 갈 수 있을까요? 사전에 감사합니다.

편집 :

나머지 스트림 계산하는 다른 방법을 사용하려고 시도한 :

(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)))) 

이의 새로운 출력 반환 : 당신은 str에 돌연변이 필요

---> ((4 . 4) 4 . 4) 
+0

감사합니다, 당신은 안녕하세요,이 방법은 잘 작동 –

답변

0

을, 그렇지 않으면 첫 번째 요소를 계속 반환합니다. 예를 들어, 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이 없으므로 테스트가 사실이 아닙니다. 어떤 도움

(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) 
+1

이있는 경우 :

편집 여기 R5RS에 포트에 쉽게해야합니다 표준 라켓에 set!없는 버전,이다. 그러나 돌연변이없이 이것을 할 수 있을까요? 예를 들어, 변형 된 S-exp와 나머지 스트림 값을 반환하는 다른 함수를 정의 할 수 있습니까? 가능한 한 기능을 유지하려고 노력하고 있으므로 –

+0

네, 그렇지만 반드시 좋아 보이지는 않습니다. 그러면'let-values ​​'로 작업해야합니다. 어떤 구현을 사용하고 있습니까 (라켓, MIT, 치킨, ...)? – uselpa

+0

명확한 설명을 위해 편집을 참조하십시오. 도움을 주셔서 감사합니다. –

관련 문제