2

この関数は#t、リストeがインクリメンタルに並べられている場合に返されるはずです。機能が動作せず、修正できません。

(define (ordered e)
  (if (or (null? e) (> length(e) 1))
      #t
      (if (> (car e) (cadr e))
          #f
          (ordered (cdr e)))))
4

1 に答える 1

1

問題の基本的なケースは間違っています.2つ未満の要素しかない場合、リストが順序付けられていると単純に述べる方が簡単です(そしてエラーが発生しにくくなります)。それがあなたのコードで問題を引き起こしていたものです.基本ケースが正しく定義されていないため、プロシージャは2番目のケースに入るべきではありません. リストの要素が 2 つ未満の場合、 は使用できませんcadr。実装を修正するには、次のようにします。

(define (ordered e) 
  (if (< (length e) 2)
      #t 
      (if (> (car e) (cadr e))
          #f 
          (ordered (cdr e)))))

を使用すると、この問題の解決策をより簡潔に表現できます。次のように (実装によっては操作になる可能性があります)condを使用することを避けることができます。lengthO(n)

(define (ordered e)
  (cond ((or (null? e) (null? (cdr e))) #t)
        ((> (car e) (cadr e)) #f)
        (else (ordered (cdr e)))))
于 2012-05-25T15:34:32.173 に答える