(wat-aro)

生きてます

SICP 問題 4.36

(define (a-pythagorean-triple-between low high)
  (let ((i (an-integer-between low high)))
    (let ((j (an-integer-between i high)))
      (let ((k (an-integer-between j high)))
        (require (= (+ (* i i) (* j j)) (* k k)))
        (list i j k)))))

;; an-integer-stating-fromを使った場合
(define (a-pythagorean-triple-from low)
  (let ((i (an-integer-starting-from low)))
    (let ((j (an-integer-starting-from i)))
      (let ((k (an-integer-starting-from j)))
        (require (= (+ (* i i) (* j j)) (* k k)))
        (list i j k)))))

後者のピタゴラス数の生成方法だとi->j->kの順番で整数が作られてrequireでテストされる.
テストが失敗すれば直前の分岐に戻って別の道を選ぶのでこの場合kが変更され,+1される.
(*k k)の値が(+ (* i i) (* j j))の値をうわまった時,テストは常に失敗するが,新たなkが生成され続けこの手続きは止まらない.
 
前者であれば,kの値が増えていっても上限が決められているのでそこでjの値を変更する分岐に入ることができる.
そのため後者のように止まらないという事態には陥らない.