2014-03-24 3 views
0

목록을 인수로 취하고 목록이 오름차순으로 정렬되는지 나타내는 부울 (#t 또는 #f)을 반환하는 함수를 정의하려고합니다.목록이 라켓에서 정렬되어 있는지 확인하는 방법?

(sorted? '(1 2 3 4 5))    ; => #t 
(sorted? '(1 2 5 6 4))    ; => #f 
(sorted? '("frank" "adam" "eve")) ; => #f 
(sorted? '("adam" "eve" "frank")) ; => #t 

여기에 솔루션에서 내 시도이다 : 나는 문자열 부분에 대해 오류가 계속

(define (sorted? lst) 
    (cond 
    [(< (length lst) 2] 
    [(<= (car lst) (cadr lst)) (sorted? (cdr lst))] 
    [(string? lst) (string<=? (car lst) (cadr lst)) (sorted? (cdr lst))] 
    [else #f])) 

가, 내가 알아낼 수없는 함수의 출력은 다음과 같이해야한다 내가 뭘 잘못하고있어. 동일한 정의에서 두 가지 유형이 있기 때문에 오류가 발생합니까? 나는 목록에있는 인수가 조건에 맞지 않으면 조건문이므로 무시해야한다고 가정합니다. 나는이 때 새로운데 도움이 필요해. 내가 잘못하고있는 일과 내가 이것을 해결하기 위해 무엇을해야 하는지를 안다면 지식을 공유하십시오. 감사.

답변

0

모든 유형에서 작동하는 Scheme 또는 Racket에는 범용 <이 없습니다.

어떻게 Racket의 sort 함수가 정의되었는지 힌트를 얻을 수 있습니다. 뿐만 아니라 list? 인수를 취합니다. 또한 less-than? 인수를 취합니다.이 값은 < 또는 string<?이거나 목록에있는 유형의 유형에 적합한 값을 취할 수있는 (any/c any/c . -> . any/c)입니다.

귀하의 sorted? 기능은 동일한 작업을 수행 할 수 있습니다. 목록과 less-than? 인수를 취하십시오.

1

은 보통 수치와 어휘 종류를 혼합 할 수 있지만이 값 비교할 수있는 초 동안 상상 할 수 없습니다 :

(define (any<? a b) 
    (cond ((and (number? a) (number? b)) (< a b)) 
     ((and (string? a) (string? b)) (string<? a b)) 
     ;; You can add types here. As a default we cast it 
     ;; to string and compare it as string 
     ;; NB! format is Racket specific 
     (else (string<? (format "~A" a) (format "~A" b))))) 

그래서 일종의 뭔가 수를 :

(define unsorted '(#\a 5 "hello" 9 (a c b) 10 (a b c) "50")) 

;; NB: sort is racket specific, R6RS has list-sort 
;; with the arguments in reverse order. 
(define sorted (sort test any<?)) 
test2 ; ==> ((a b c) (a c b) 5 "50" 9 10 #\a "hello") 

;; Using a named let with the current element 
;; makes you only check null? once for each pair 
(define (sorted? lst <) 
    (or (null? lst) 
     (let loop ((e (car lst)) (lst (cdr lst))) 
     (or (null? lst) 
      (and (not (< (car lst) e)) 
       (loop (car lst) (cdr lst))))))) 

(sorted? unsorted any<?) ; ==> #f 
(sorted? sorted any<?) ; ==> #t 

당신 any<?을 사용하지 않지만 목록의 요소 유형을 알고있는 경우 해당 데이터의 특정 비교 절차를 사용합니다. 예 :

(sorted? '("a" "b" "cd") string<?) ; ==> #t 
(sorted? '(4 7 3 5 9 3 4 6) <)  ; ==> #f 
0

다른 사람들이 언급했듯이, 사용자가 의도 한 바를 비교하는 '테스트/비교'기능이 필요합니다. 당신은 부울 결과를 얻을 수 andor을 악용하는 경우

(define (sorted? test< list) 
    (or (null? list) 
     (null? (cdr list)) 
     (and (test< (car list) (cadr list)) 
      (sorted? test< (cdr list)))) 

기능의이 종류는 '좋아 보이는': 감안할.

> (sorted? < '(0 1 2 3 0)) 
#f 
> (sorted? < '(0 1 2 3 4)) 
#t 
> (sorted? string<? '("a" "b" "c" "a")) 
#f 
> (sorted? char<? '(#\a #\b #\a)) 
#f 
> 
관련 문제