ell*_*414 3 recursion scheme while-loop
(define (orderedTriples n)
(set! i n)
(set! j n)
(set! k n)
(while (>= i 0)
(while (>= j 0)
(while (>= k 0)
(printf "(~a, ~a, ~a)" i j k)
(set! k (- k 1)))
(set! j (- j 1)))
(set! i (- i 1))))
Run Code Online (Sandbox Code Playgroud)
所以我的问题是...我对如何使while循环在方案中起作用感到困惑(我对此很陌生,所以如果我离开的话请原谅语法)。我在此处输入的目的只是为了解决问题并显示我要实现的目标。有人可以通过简单的递归示例或嵌套递归帮助我吗?
根据所使用的方案解释器,有几种方法可以实现所需的循环。例如,在Racket中,就像使用迭代和理解一样简单:
(define (orderedTriples n)
(for* ([i (in-range n -1 -1)]
[j (in-range n -1 -1)]
[k (in-range n -1 -1)])
(printf "(~a, ~a, ~a)" i j k)))
Run Code Online (Sandbox Code Playgroud)
在Scheme中,强烈反对在问题中显示的编程风格(假设它可以工作)-使用变异(set!操作)进行循环是一个很大的禁忌,这就是您使用类C语言解决问题的方法,但是特别是在Scheme中(通常在Lisp中),还有其他用于在程序中实现迭代的构造(do例如@TerjeD提供的解决方案演示了的使用),即使这样的构造不存在,也可以使用递归解决方案或使用高阶过程的解决方案将是首选。例如,这是另一种可能的解决方案,仅对标准过程使用嵌套映射(除了printf,这是非标准的):
(define (range n)
(if (negative? n)
'()
(cons n (range (- n 1)))))
(define (orderedTriples n)
(for-each (lambda (i)
(for-each (lambda (j)
(for-each (lambda (k)
(printf "(~a, ~a, ~a)" i j k))
(range n)))
(range n)))
(range n)))
Run Code Online (Sandbox Code Playgroud)