2013-02-03 45 views
2
(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)))) 

所以我的問題是...我很困惑,如何使while循環的方案工作(我很新,所以藉口語法,如果我WAY關閉)。我在此輸入的目的只是爲了解決問題,並展示我正在努力完成的任務。任何人都可以幫助我一個簡單的遞歸示例或嵌套遞歸?遞歸(或while循環)方案

回答

3

根據使用的Scheme解釋器,有幾種方法可以實現所需的循環。例如,在拍它的使用iterations and comprehensions簡單:

(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))) 

(假設它的工作)的問題出編程的風格在很大程度上鼓勵方案 - 使用突變(該set!操作)的循環是一個很大的no-no,這就是你如何用類似C語言解決問題的方法,但是在Scheme中(特別是在Lisp中),還有其他一些用於在程序中實現迭代的構造(由@TerjeD給出的解決方案演示了例如使用do),並且即使這樣的構造不存在,遞歸解決方案或使用higher-order procedures的解決方案也將是優選的。例如,這裏的另一個可能的解決方案,使用nested mappings只有標準程序(與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))) 
+1

這真的很有幫助!謝謝! – ellie0414

1

如果你要,你可以用遞歸做到這一點。

(define (ordered-triples n) 
    (let iloop ((i n)) 
    (unless (negative? i) 
     (let jloop ((j n)) 
     (unless (negative? j) 
      (let kloop ((k n)) 
      (unless (negative? k) 
       (printf "~a ~a ~a\n" i j k) 
       (kloop (sub1 k)))) 
      (jloop (sub1 j)))) 
     (iloop (sub1 i))))) 

當然,它更容易使用球拍的for*循環。