2017-10-07 4 views
1

for 루프를 사용하여 for 루프를 재귀 함수 내부에서 구현하려고했습니다. 이미 구현 된 "for"를 라켓으로 사용하는 것은 허용되지 않습니다. 그러한 경우를 구현할 수있는 방법이 있습니까?라켓에 for 루프 구현

참고 : 동일한 중급 학생 언어를 사용하고 있습니다.

답변

0

다음은 예입니다. squares 함수는 첫 번째 n의 목록을 만듭니다. 그리스트를 생성하기 위해, 인덱스 i을 사용하여 숫자 0, ..., n-1을 반복합니다.

(define (squares n) 
    (define (loop i) 
     (if (= i n) 
      '() 
      (cons (* i i) (loop (+ i 1))))) 
    (loop 0)) 

(squares 10) 
+0

이 코드를 사용하면 다음과 같은 배열이 생깁니다. "define : 함수 본문에 대해 하나의 표현식이 필요 하나 추가 부분이 하나만 있습니다" – Deesha

+0

Derik 교수 언어를 사용하는 경우 어느 언어를 지정해야합니다. – soegaard

+0

내부 정의를 로컬로 감싸십시오. 로컬 사용 방법 조회. – soegaard

1

먼저 오프 #lang racketfor의 부작용 순수하다. 일반적으로 for/mapfor/fold과 같은 다른 변형이 결국 값을 생성하기를 원할 것입니다.

라켓은 Scheme의 자손이며, 모든 루핑은 재귀 함수가 적용되는 구문 당뿐입니다. 일례 do 루프로 :

(do ((vec (make-vector 5)) 
    (i 0 (+ i 1))) 
    ((= i 5) vec) 
    (vector-set! vec i i))     
; ==> #(0 1 2 3 4) 

실제로 언어는 원시적으로 do이 없습니다.

(let loop ((vec (make-vector 5)) (i 0)) 
    (if (= i 5) 
     vec 
     (begin 
     (vector-set! vec i i) 
     (loop vec (+ i 1))))) 

이이 코스 바로 설탕이다 : 대신 구현은 보통이 (유사하거나 뭔가)로 만드는 매크로가

((letrec ((loop (lambda (vec i) 
        (if (= i 5) 
         vec 
         (begin 
          (vector-set! vec i i) 
          (loop vec (+ i 1))))))) 
    loop) 
(make-vector 5) (i 0)) 

물론 letrec

은 설탕입니다 .. 어떤 수준에서는 lambda을 사용합니다.