2017-10-03 9 views
-2

이 함수는 문자열이나 int가 모두 포함 된 목록을 가져 와서 'if'문으로 시작하는 이유입니다.이 함수는 오름차순인지 확인합니다.Racket : 목록의 요소를 반복적으로 비교

마지막 재귀 호출에서와 같이 'car'가 마지막 요소이므로 'cadr'에서 가져올 항목이 없습니다. 충돌을 막는 방법을 알아낼 수 없었습니다.

나는 정렬 된 함수가 있음을 알고 있지만이 함수를 재귀 적으로 구현해야합니다.

도움 주셔서 감사합니다. 당신이 시도해야

답변

1

두 가지 가장 기본적인 목록은 다음과 같습니다가이 두 시험 서로 다른 수준에서 실패합니다 있도록

(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와 코드를 수행 할 수있는 모든 문자열 요소 나해야 하나 목록 이후

(cond 
    ((not (number? (car lst))) #f) 
    ((< (car lst) (cadr lst)) (my-sorted? (rest lst)) 
    (else #f)) 

편집

당신은 단순히보고 비교 기능을 확인할 수 있습니다 숫자로 모든 첫 번째 요소를 호출하고 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가 모두 포함되어 있으면 오류를 출력해야한다는 것입니다. 그래서, 제 생각은 int (if (number?) 라인을 사용하여)를 핸들하는 함수를 깬 다음 else 조건을 가지고 대문자 소문자를 처리하도록하는 것입니다. 나는 문자열 케이스에 대한 비교를 만들기 위해 라켓에있는 문자열의 ASCII 값을 지금 얻을 수 있는지 알아 내려고하고있다. cond가 모든 경우를 처리 할 수 ​​있습니까? –

+0

@ BrianJay 같은 유형의 요소가 있으므로 비교 함수를 한 번 결정할 수 있습니다. 내 편집을 참조하십시오. – Sylwester