在球拍中实现for循环

时间:2017-10-07 19:12:44

标签: scheme racket

我一直在尝试使用for循环在递归函数中实现for循环。不允许在球拍中使用已经实现的“for”。有没有办法实现这种情况?

注意:我使用的是中级学生语言。

2 个答案:

答案 0 :(得分:2)

首先关闭for #lang racket中的for/map纯粹是出于副作用。通常,您希望其他变体(如for/folddo)最终生成一个值。

Racket是Scheme的后代,其中的所有循环只是应用递归函数的语法糖。例如(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也是糖...它只是在某种程度上使用ROOT_URLCONF

答案 1 :(得分: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)