2017-10-03 6 views
-2

この関数は、リスト(文字列または整数の完全なものであるため、その 'if'文で始まる)を取得し、昇順であるかどうかを確認する必要があります。Racket:リスト内の要素を再帰的に比較する

最後の再帰呼び出しのように、「car」が最終要素であるため、「cadr」には何も付いていないので、これをクラッシュさせないようにする方法はわかりませんでした。

(define (my-sorted? lst) 
    (if (number? (car lst)) 
    (if (< (car lst) (cadr lst)) 
     (my-sorted? (rest lst))  
     #f)  
    #f) 
) 

ソートされた関数が存在することは知っていますが、この関数を再帰的に実装する必要があります。

ありがとうございました。あなたは試してみてください

答えて

1

二つの最も基本的なリストは以下のとおりです。それは、これら2つのテストと異なるレベルで失敗するよう

(my-sorted? '()) ; ==> #t (empty list is always sorted) 
(my-sorted? '(1)) ; ==> #t (one element list is always sorted) 

あなたの現在のコードは、ちょうどその引数にcarcadrを行います。

数字と数字を比較する方法があります。 <は両方の引数が数字であることを期待していますが、リストは文字列と数字の両方になります。 "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 ...))))) 
+0

ありがとうございました。実際には、リストは文字列または整数のみにすることができます - 私はそれについて明確でない場合は申し訳ありません。私が満足する必要がある別の条件は、リストに実際に文字列と整数の両方が含まれている場合、エラーを出力する必要があるということです。だから、私の考えは、int(if(number?)行を使って)を処理し、else条件で文字列の大文字小文字を処理する関数を打ち破ることでした。文字列の大文字小文字の比較を行うために、文字列のASCII値をラケットに入れることができるかどうかを調べようとしています。 condはすべてのケースを扱うことができるだろうか? –

+0

@BrianJay同じ種類の要素があるので、比較関数を一度決定することができます。私の編集を参照してください。 – Sylwester

関連する問題