Scheme 如何在方案中使用双do循环?
我想使用“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。我做错什么了吗?我该如何纠正它 致迈克尔·韦尔斯 非常感谢,它真的很有效!但我仍然对退出条件感到困惑。我试图将代码中的更改为=,它显示
(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时停止打印吗()
(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
构造定义了新的循环变量。ado
循环只是递归函数的语法糖。你最好习惯直接写。下面是一种使用名为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循环似乎也很有用,我来试试。