二つの最も基本的なリストは以下のとおりです。それは、これら2つのテストと異なるレベルで失敗するよう
(my-sorted? '()) ; ==> #t (empty list is always sorted)
(my-sorted? '(1)) ; ==> #t (one element list is always sorted)
あなたの現在のコードは、ちょうどその引数にcar
とcadr
を行います。
数字と数字を比較する方法があります。 <
は両方の引数が数字であることを期待していますが、リストは文字列と数字の両方になります。 "x"
と7
のうち小さいものは何ですか? (< 7 "x")
はできません。
if
をネストする代わりに、cond
はif-elseif-elseのやり方であると考えられます。リストには、すべての文字列としての要素または全てのいずれかである必要がありますので数としてあなたは、単にだけを見て、比較関数を決定することができ
(cond
((not (number? (car lst))) #f)
((< (car lst) (cadr lst)) (my-sorted? (rest lst))
(else #f))
EDIT
:基本的には、このようなcond
であなたのコードを行うことができます最初の要素と再帰を行い、名前はlet
で、最初の要素に基づいて再利用します。
(define (my-sorted lst)
;; determine what comparison function to use, bind it to greater?
(define greater?
(if (and (pair? lst) (number? (car lst)))
>
string>?))
;; main recursive loop uses that one function
;; this can be done with define + call as well
(let loop ((lst lst))
(cond ((or (null? lst) (null? (cdr lst))) ...)
((greater? (car lst) (cadr lst)) ...)
(else (loop ...)))))
ありがとうございました。実際には、リストは文字列または整数のみにすることができます - 私はそれについて明確でない場合は申し訳ありません。私が満足する必要がある別の条件は、リストに実際に文字列と整数の両方が含まれている場合、エラーを出力する必要があるということです。だから、私の考えは、int(if(number?)行を使って)を処理し、else条件で文字列の大文字小文字を処理する関数を打ち破ることでした。文字列の大文字小文字の比較を行うために、文字列のASCII値をラケットに入れることができるかどうかを調べようとしています。 condはすべてのケースを扱うことができるだろうか? –
@BrianJay同じ種類の要素があるので、比較関数を一度決定することができます。私の編集を参照してください。 – Sylwester