我一直在尝试使用for循环在递归函数中实现for循环。不允许在球拍中使用已经实现的“for”。有没有办法实现这种情况?
注意:我使用的是中级学生语言。
答案 0 :(得分:2)
首先关闭for
#lang racket
中的for/map
纯粹是出于副作用。通常,您希望其他变体(如for/fold
和do
)最终生成一个值。
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)