Scheme 如何在方案中使用双do循环?

Scheme 如何在方案中使用双do循环?,scheme,Scheme,我想使用“do”命令来显示(11)(12)(13)(21)(22)(23)(31)(32)(32)(33) 我的代码如下: (lambda ( ) (define a 1) (define b 1) (do ((a 1 (+ a 1))) (= a 3) (do ((b 1 (+ b 1))) (= b 3) (display a b) ))) 但结果只显示3。我做错什么了吗?我该如何纠正它 致迈克尔·韦尔斯 非常感谢,它真的很有效!但我仍然对退出条件感到困惑。我试图将代码中的更改为=,它显示

我想使用“do”命令来显示
(11)(12)(13)(21)(22)(23)(31)(32)(32)(33)
我的代码如下:

(lambda ( )
(define a 1)
(define b 1)
(do ((a 1 (+ a 1))) (= a 3)
(do ((b 1 (+ b 1))) (= b 3)
(display a b)
)))
但结果只显示
3
。我做错什么了吗?我该如何纠正它

致迈克尔·韦尔斯

  • 非常感谢,它真的很有效!但我仍然对退出条件感到困惑。我试图将代码中的
    更改为
    =
    ,它显示
    (11)(12)(21)(22)
    。是因为a=3时停止打印吗

  • 所以“list”命令可以组合多个变量。但是“换行”命令呢?我试图删除它,但它只是在最后添加了另一个
    ()

  • 谢谢你的回答。我是一个新的计划学习者,试图在TracePro上使用它。关于学习计划,你们有什么建议(书籍、Youtube视频、网站)给我吗?任何建议都会有帮助

  • 你的意思是:

      (lambda ()
        (do ((a 1 (+ a 1)))
            ((> a 3) (newline))
          (do ((b 1 (+ b 1)))
              ((> b 3))
            (display (list a b))))))
    

    您的代码存在许多问题:
    do
    循环的退出条件不正确(并使您的过程返回
    3
    )<代码>显示将单个对象和可选端口作为参数。定义变量
    a
    b
    是不必要的,因为
    do
    构造定义了新的循环变量。

    a
    do
    循环只是递归函数的语法糖。你最好习惯直接写。下面是一种使用名为let的方法,其中包含两个变量和一个累加器

    (let loop ((a 3) (b 3) (acc '()))
      (cond ((zero? a) acc)                                  ; finished
            ((zero? b) (loop (sub1 a) 3  acc))               ; b finsihed, reduce a and reset b
            (else (loop a (sub1 b) (cons (list a b) acc))))) ; reduce b and add to front of acc
    ; ==> ((1 1) (1 2) (1 3) (2 1) (2 2) (2 3) (3 1) (3 2) (3 3))
    

    请注意,这会使结果按相反顺序排列,因此对于总是按相反顺序创建的列表来说,这是最佳选择,因为这样只能在前面添加新元素。

    4。这些都是旧的,但仍然是金子。在第一堂课中,你不需要了解任何有关计算机语言的知识,你可以在20堂课中学习如何编译成机器代码,以及计算机如何实际工作。谢谢你的建议!这些讲座似乎很完整,很有帮助。我会开始做的。let循环似乎也很有用,我来试试。