数字のリストが昇順であるかどうかを判断するために、ラケットに2つの異なる関数を記述しました。
(define (ascending list)
(if (<= (length list) 1)
#t
(and (< (car list) (car (cdr list))) (ascending (cdr list)))))
(define (ascending-tail list)
(ascending-tail-helper #t list))
(define (ascending-tail-helper prevBool rest)
(if (<= (length rest) 1)
prevBool
(ascending-tail-helper (and prevBool (< (car rest) (car (cdr rest)))) (cdr rest))))
最初の昇順が末尾再帰であるかどうかを判断するのに最も苦労したので、末尾再帰であると信じているものを使用して書き直しました。
最初の引数が末尾再帰ではないと遡及的に信じる理由は、再帰の各レベルで、関数がブール式を評価する前に、「and」ステートメントの2番目の引数が戻るのを待っているためです。逆に、ascending-tail-helperの場合、再帰呼び出しを行う前に、より少ない式を評価することができます。
これは正しいですか、それとも私は以前よりもさらに混乱しましたか?