이 함수는 문자열이나 int가 모두 포함 된 목록을 가져 와서 'if'문으로 시작하는 이유입니다.이 함수는 오름차순인지 확인합니다.Racket : 목록의 요소를 반복적으로 비교
마지막 재귀 호출에서와 같이 'car'가 마지막 요소이므로 'cadr'에서 가져올 항목이 없습니다. 충돌을 막는 방법을 알아낼 수 없었습니다.
나는 정렬 된 함수가 있음을 알고 있지만이 함수를 재귀 적으로 구현해야합니다.
도움 주셔서 감사합니다. 당신이 시도해야
이 함수는 문자열이나 int가 모두 포함 된 목록을 가져 와서 'if'문으로 시작하는 이유입니다.이 함수는 오름차순인지 확인합니다.Racket : 목록의 요소를 반복적으로 비교
마지막 재귀 호출에서와 같이 'car'가 마지막 요소이므로 'cadr'에서 가져올 항목이 없습니다. 충돌을 막는 방법을 알아낼 수 없었습니다.
나는 정렬 된 함수가 있음을 알고 있지만이 함수를 재귀 적으로 구현해야합니다.
도움 주셔서 감사합니다. 당신이 시도해야
두 가지 가장 기본적인 목록은 다음과 같습니다가이 두 시험 서로 다른 수준에서 실패합니다 있도록
(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
와 코드를 수행 할 수있는 모든 문자열 요소 나해야 하나 목록 이후
(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 ...)))))
도움 주셔서 감사합니다. 사실, 그 목록은 문자열 또는 정수일 수 있습니다 - 미안하지만 분명하지 않다면. 만족해야 할 또 다른 조건은 목록에 실제로 문자열과 int가 모두 포함되어 있으면 오류를 출력해야한다는 것입니다. 그래서, 제 생각은 int (if (number?) 라인을 사용하여)를 핸들하는 함수를 깬 다음 else 조건을 가지고 대문자 소문자를 처리하도록하는 것입니다. 나는 문자열 케이스에 대한 비교를 만들기 위해 라켓에있는 문자열의 ASCII 값을 지금 얻을 수 있는지 알아 내려고하고있다. cond가 모든 경우를 처리 할 수 있습니까? –
@ BrianJay 같은 유형의 요소가 있으므로 비교 함수를 한 번 결정할 수 있습니다. 내 편집을 참조하십시오. – Sylwester