如何在scheme中创建嵌套循环

时间:2013-04-22 05:38:34

标签: for-loop scheme nested-loops

我是scheme的新手,我正在尝试创建嵌套循环,其中C代码如下所示: -

for(i = -1, a = 0; i > -5, a < 5; i--, a++)
{ 
   for(j = i, b = 0; j < (abs(i)), b < 5; j++, b++)
   { 
      <do something>
   }
}

我在计划中用这个概念尝试了类似的事情: -

(let oloop( (i -1) (a 0))
            (display i)(display a) (newline) 
            (if (and (> i -5) (< a 5)) (oloop((- i 1) (+ a 1))))))

我无法嵌套所有四个循环以及上面的代码无效。

请建议。

3 个答案:

答案 0 :(得分:6)

编写这些嵌套循环的一种方法是使用do循环构造,它接受3个参数:要绑定的变量(具有初始值和更新表单),终止条件和正文形式:

(do ((i -1 (- i 1))                ; Count i downwards from -1
     (a  0 (+ a 1)))               ; Cound a upwards from 0
    ((or (= i -5) (= a 5)))        ; Stop when i = -5 or a = 5
  ;; Body of outer loop
  (do ((j i (+ j 1))               ; Count j upwards from i
       (b 0 (+ b 1)))              ; Count b upwards from 0
      ((or (= (abs i) j) (= b 5))) ; Stop when j = abs(j) or b = 5
    ;; Body of inner loop: Do something
    ))

如果你坚持通过递归来做,使用named let,它可以像这样完成,但缺点是更新变量的表单远离初始化和终止形式:

(let outer ((i -1) (a 0))
  (if (and (> i -5) (< a 5))
      (begin
        (let inner ((j i) (b 0))
          (if (and (< j (abs i)) (< b 5))
              (begin
                ; Do something
                ; then loop
                (inner (+ j 1) (+ b 1)))))
        (outer (- i 1) (+ a 1)))))

答案 1 :(得分:0)

您的Scheme示例中等效于i--的位置是什么?

(+ i 1)

我的计划有点生疏,但我不认为就是这样。

另外,我不确定你在C程序中从哪里得到这个基本案例?

(< i 10)

答案 2 :(得分:0)

如果你正在使用Racket,那么使用iterations and comprehensions可以很简单地实现C风格的循环。代码看起来几乎相同:

(for [(i (in-range -1 -5 -1))
      (a (in-range 0 5))]
  ; body of the outer loop
  ; do something with i a
  (for [(j (in-range i (abs i)))
        (b (in-range 0 5))]
    ; body of the inner loop
    ; do something with i a j b
    (display (list i a j b))))