我是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))))))
我无法嵌套所有四个循环以及上面的代码无效。
请建议。
答案 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))))