주어진 숫자가 그 사이에있는 두 요소를 검색하는 함수를 작성하고 싶습니다. (element1 <num <element2) 및 목록에서 첫 번째 요소의 위치.
;; check x is between num-1 and num-2
(define (in-between? x num-1 num-2)
(or (and (> num-1 x) (< num-2 x))
(and (> num-2 x) (< num-1 x))))
;; the list elements values are always in ascending order
(define lst '(0 0 0 1 1 1 2 2 2 3 3 4 4 5 5 6 6 6 7))
(define num 4.5)
;; expected-output=> 4.5 lies between element 4 and 5 of lst
;; '(4 5 12) ;; 12 is the position of first-element
;; output is list of 2 elements and the position of first-element
(define (find-interval u lst)
(let* ([x (for/list ([a (drop-right lst 1)]
[b (cdr lst)]
[i (in-naturals)])
(when (in-between? u a b)
(list a b i)))])
(car (filter list? x)))) ; to remove all #<void>
;; => '(4 5 12)
나는 사용해야 (car (filter list? x))
제거 #<void>
에 출력 x
결과 인 '(#<void> #<void> #<void> #<void> #<void> #<void> #<void> #<void> #<void> #<void> #<void> #<void> (4 5 12) #<void> #<void> #<void> #<void> #<void>)
.
어떻게 그 방지 할 #<void>
에서 나오는 목록 for/list
에서를 x
? find-interval
기능에 불필요하게 긴 단계가있는 것 같습니다. 모든 제안을 환영하고 감사합니다.
목록이 항상 오름차순이라고 가정하면 함수는 반복적 인 방식으로 컴파일되는 간단한 꼬리 재귀로 정의 할 수 있습니다.
(define (find-interval el lst (pos 0))
(cond ((null? lst) '())
((null? (cdr lst)) '())
((>= (car lst) el) '())
((< (car lst) el (cadr lst)) (list (car lst) (cadr lst) pos))
(else (find-interval el (cdr lst) (+ 1 pos)))))
(find-interval 4.5 '(0 0 0 1 1 1 2 2 2 3 3 4 4 5 5 6 6 6 7)) ; => '(4 5 12)
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다