For loop 如何在scheme中创建嵌套循环

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

我是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<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)
编写这些嵌套循环的一种方法是使用to
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
    ))
如果您坚持使用命名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)(
编写这些嵌套循环的一种方法是使用to
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
    ))
如果您坚持使用命名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请给我们看看你们的第二个循环方案。