2013-05-18 90 views
4

有没有人知道一个范围内的数字嵌套循环的惯用方法是在球拍/方案?在Python中,我们有:在球拍/方案中的语言嵌套循环

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

什么是球拍/计划等价物?

回答

11

球拍是这样简单,使用Iterations and Comprehensions

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

以上仅在球拍工作。相比之下,以下片段将在任何标准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)) 
+2

作为一个小P .S。 Óscar的优秀答案:在Racket中,最好是功能性的。所以你可能会发现自己使用'for'的变体来返回一个值,例如'for/list','/ vector'等。这些是建立在'for/fold'上的,这是最通用的“迭代和积累”形式。当然,当你为了效果而需要做某些事情时(比如I/O),那么你可能会使用普通的'for';加上它最容易理解,所以这是很棒的。 –