1

我是方案新手,我正在尝试创建嵌套循环,其 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))))))

我无法嵌套所有四个循环加上上面的代码不起作用。

请建议。

4

3 回答 3

8

编写这些嵌套循环的一种方法是使用 todo循环构造,它接受 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
    ))

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

(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)))))
于 2013-04-22T08:05:06.010 回答
0

i--您的 Scheme 样本中的等价物在哪里?

(+ i 1)

我对我的方案有点生疏,但我不认为就是这样。

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

(< i 10)
于 2013-04-22T05:45:27.813 回答
0

如果您使用的是 Racket,那么有一种非常简单的方法可以实现 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))))
于 2013-04-22T14:52:16.130 回答