2017-10-07 59 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