この関数は#t
、リストe
がインクリメンタルに並べられている場合に返されるはずです。機能が動作せず、修正できません。
(define (ordered e)
(if (or (null? e) (> length(e) 1))
#t
(if (> (car e) (cadr e))
#f
(ordered (cdr e)))))
問題の基本的なケースは間違っています.2つ未満の要素しかない場合、リストが順序付けられていると単純に述べる方が簡単です(そしてエラーが発生しにくくなります)。それがあなたのコードで問題を引き起こしていたものです.基本ケースが正しく定義されていないため、プロシージャは2番目のケースに入るべきではありません. リストの要素が 2 つ未満の場合、 は使用できませんcadr
。実装を修正するには、次のようにします。
(define (ordered e)
(if (< (length e) 2)
#t
(if (> (car e) (cadr e))
#f
(ordered (cdr e)))))
を使用すると、この問題の解決策をより簡潔に表現できます。次のように (実装によっては操作になる可能性があります)cond
を使用することを避けることができます。length
O(n)
(define (ordered e)
(cond ((or (null? e) (null? (cdr e))) #t)
((> (car e) (cadr e)) #f)
(else (ordered (cdr e)))))