4

有没有人知道在 Racket/Scheme 中对范围内的数字进行嵌套循环的惯用方法是什么?在 Python 中,我们有:

for i in range(numb1):
    for j in range(numb2):

Racket/Scheme 中的等价物是什么?

4

1 回答 1

12

在 Racket 中,使用Iterations 和 Comprehensions就这么简单:

(for* ([i (in-range numb1)]
       [j (in-range numb2)])
  <body of iteration>)

以上仅适用于 Racket。相比之下,以下代码片段可以在任何标准 RxRS 解释器中工作——例如,使用一对嵌套的do

(do ((i 0 (+ i 1))) ((= i numb1))
  (do ((j 0 (+ j 1))) ((= j numb2))
    <body of iteration>))

另一种选择:使用显式递归和命名let

(let loop1 ((i 0))
  (cond ((< i numb1)
         (let loop2 ((j 0))
           (cond ((< j numb2)
                  <body of iteration>
                  (loop2 (+ j 1)))))
         (loop1 (+ i 1)))))

最后,您始终可以执行以下操作,有关详细信息,请参阅“嵌套映射”部分下的SICP :

(define (range start stop)
  (let loop ((i (- stop 1))
             (acc '()))
    (if (< i start)
        acc
        (loop (- i 1) (cons i acc)))))

(for-each
 (lambda (i)
   (for-each
    (lambda (j)
      <body of iteration>)
    (range 0 numb2)))
 (range 0 numb1))
于 2013-05-18T20:16:12.007 回答