For loop 如何在scheme中创建嵌套循环
我是scheme的新手,我正在尝试创建嵌套循环,其C代码如下所示:-For loop 如何在scheme中创建嵌套循环,for-loop,scheme,nested-loops,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> } } for(i=-1,a=0;i>-5,a
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>
}
}
for(i=-1,a=0;i>-5,a<5;i--,a++)
{
对于(j=i,b=0;j<(abs(i)),b<5;j++,b++)
{
}
}
我在这个概念的方案中尝试了类似的事情:-
(let oloop( (i -1) (a 0))
(display i)(display a) (newline)
(if (and (> i -5) (< a 5)) (oloop((- i 1) (+ a 1))))))
(让oloop((i-1)(a0))
(显示i)(显示a)(换行)
(如果(和(>i-5)(
我不能嵌套所有四个循环,加上上面的代码不起作用
请建议。在您的方案示例中,与
i--
等效的内容在哪里
(+ i 1)
我对我的计划有点生疏,但我不认为是这样
另外,我不确定你的C程序从哪里得到这个基本情况
(< i 10)
(
在您的方案示例中,i--
的等价物在哪里
(+ i 1)
我对我的计划有点生疏,但我不认为是这样
另外,我不确定你的C程序从哪里得到这个基本情况
(< i 10)
(
编写这些嵌套循环的一种方法是使用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通过递归实现,则可以这样做,其缺点是更新变量的表单远离初始化和终止表单:
(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)))))
(让外部((i-1)(a0))
(如果(和(>i-5)(
编写这些嵌套循环的一种方法是使用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通过递归实现,则可以这样做,其缺点是更新变量的表单远离初始化和终止表单:
(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)))))
(让外部((i-1)(a0))
(如果(和(>i-5)(
如果您使用的是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))))
如果您使用的是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))))
发布问题j<(abs(i)还需要一个括号。另外,我不是一个真正的C程序员,但条件j<(abs(i))是错误的永远不会满足?我是对的吗?还是不对?似乎这些都是次要的事情,因为我只想在scheme中实现相同的实现..这是我的主要关注点…我写C代码只是为了告诉我真正想要的..请忽略C代码问题A好的,但简化C代码也应该简化scheme代码。第一个循环仍然不起作用吗?如果它起作用,p请给我们展示一下你在Scheme中的第二个循环。在发布问题j<(abs(i)时出错。另外,我不是一个真正的C程序员,但条件j<(abs(i))永远不会满足?我是对的吗?还是不对?似乎这些都是次要的事情,因为我只想在scheme中实现相同的实现..这是我的主要关注点…我写C代码只是为了告诉我真正想要的..请忽略C代码问题A好的,但简化C代码也应该简化scheme代码。第一个循环仍然不起作用吗?如果它起作用,p请给我们看看你们的第二个循环方案。