2017-10-07 58 views
1

我一直在嘗試使用for循環在遞歸函數內部實現for循環。不允許在球拍中使用已經實施的「for」。有沒有辦法實施這種情況?在球拍中實現for循環

注意:我正在使用中級學生語言。

回答

0

這裏是一個例子。函數squares生成第一個方形數字的列表。爲了生成該列表,它使用索引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:預期只有一個表達式爲函數體,但是找到1個額外部分」 – Deesha

+0

Derik如果您使用的是教學語言,您需要指定哪一個。 – soegaard

+0

將內部定義包裝在本地。查找如何使用本地。 – soegaard

1

首先for#lang racket中純粹是爲副作用。通常你會想要其他變體,如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