球拍/方案中的惯用嵌套循环

cob*_*bie 4 scheme range nested-loops racket

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

for i in range(numb1):
    for j in range(numb2):
Run Code Online (Sandbox Code Playgroud)

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

Ósc*_*pez 12

在Racket中,使用迭代和理解就这么简单:

(for* ([i (in-range numb1)]
       [j (in-range numb2)])
  <body of iteration>)
Run Code Online (Sandbox Code Playgroud)

以上内容仅适用于Racket.相比之下,以下代码段将适用于任何标准RxRS解释器 - 例如,使用一对嵌套do:

(do ((i 0 (+ i 1))) ((= i numb1))
  (do ((j 0 (+ j 1))) ((= j numb2))
    <body of iteration>))
Run Code Online (Sandbox Code Playgroud)

还有一个选择:使用显式递归并命名let:

(let loop1 ((i 0))
  (cond ((< i numb1)
         (let loop2 ((j 0))
           (cond ((< j numb2)
                  <body of iteration>
                  (loop2 (+ j 1)))))
         (loop1 (+ i 1)))))
Run Code Online (Sandbox Code Playgroud)

最后,您可以随时执行以下操作,有关详细信息,请参阅"嵌套映射"部分中的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))
Run Code Online (Sandbox Code Playgroud)

  • 作为Óscar的优秀答案的小PS:在Racket中,它最好是功能性的.所以你可能会发现自己使用`for`的变量来返回一个值,例如`for/list`,`for/vector`,或者其他什么.它们建立在`for/fold`之上,这是最常见的"迭代和累积"形式.当然,当你需要做一些只是为了效果(比如I/O)时,你可能会使用普通的`for`; 加上它是最简单的理解,所以它很棒Óscar用它作为例子. (2认同)