2017-10-07 12 views
1

forループを使用してforループを再帰関数内で実装しようとしています。すでに実装されている "for"をラケットで使用することはできません。そのようなケースを実装する方法はありますか?ラウンドでforループを実装する

注:私は同じものの中学生言語を使用しています。

答えて

0

ここは例です。関数squaresは、最初のnの正方形のリストを生成します。そのリストを生成するために、インデックスiを使用して番号0、...、n-1にループします。 #lang racket

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

(squares 10) 
+0

私は次のように配列を取得します: "define:関数本体には1つの式しか期待されませんが、余分な部分が1つ見つかりました" – Deesha

+0

Derik教える言語を使用している場合、どちらを指定する必要があります。 – soegaard

+0

内部定義をローカルにラップします。ローカルの使い方を調べる。 – soegaard

1

まずオフforは、副作用のために純粋です。通常、for/mapfor/foldのような他のバリアントが最終的に値を生成することを望みます。

Racketは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を使用するだけになります。

関連する問題