方案中的递归(或while循环)

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循环在方案中起作用感到困惑(我对此很陌生,所以如果我离开的话请原谅语法)。我在此处输入的目的只是为了解决问题并显示我要实现的目标。有人可以通过简单的递归示例或嵌套递归帮助我吗?

Ósc*_*pez 5

根据所使用的方案解释器,有几种方法可以实现所需的循环。例如,在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)