neh*_*ham 1 scheme for-loop 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>
}
}
Run Code Online (Sandbox Code Playgroud)
我在计划中用这个概念尝试过类似的东西: -
(let oloop( (i -1) (a 0))
(display i)(display a) (newline)
(if (and (> i -5) (< a 5)) (oloop((- i 1) (+ a 1))))))
Run Code Online (Sandbox Code Playgroud)
我无法嵌套所有四个循环加上面的代码不起作用.
请建议.
编写这些嵌套循环的一种方法是使用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
))
Run Code Online (Sandbox Code Playgroud)
如果你坚持通过递归来做,使用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)))))
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1293 次 |
| 最近记录: |