与えられた数字が間にある2つの要素を検索する関数を書いてみたいと思います。 (element1 < num < element2)、およびリスト内の最初の要素の位置。指定された数字の昇順にリストから2つの要素を見つける
;; 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)
Iは '(#<void> #<void> #<void> #<void> #<void> #<void> #<void> #<void> #<void> #<void> #<void> #<void> (4 5 12) #<void> #<void> #<void> #<void> #<void>)
を得され、x
に#<void>
出力を排除する(car (filter list? x))
を使用しなければなりません。
リスト内の#<void>
が出てこないようにするにはfor/list
にx
を入れますか? find-interval
機能に不必要に長いステップがあるようです。すべての提案は歓迎され、感謝しています。