0

medianリストの中央値を取るという名前のプロシージャを作成しようとしています。リストが偶数の場合、真ん中の 2 つの数字を返します。ロジックは頭の中で考えつくのですが、どうやって完成させるのかわかりません。注: list-ref の使用は避けようとしています。問題が簡単になるからです。これまでのところ、私のコードは次のようになります。

(define (median lst)
(if (null? lst)
   '()
    (if (even? lst) ; ends here

さて、問題に対する私のアプローチはこれです。

Odd #- Return the value of the "car#" that's in place of (/ (+ (length lst) 1) 2)
3; 2nd car      (1 100 3)    => 100
5; 3rd car      (1 2 100 4 5)  => 100
7; 4th car      (1 2 3 100 5 6 7)  => 100
Even # - Return the value of the "car#" that's in place of (/ (length lst) 2) AND (+ (/ (length lst) 2) 1)
2; 1st and 2nd car         (1 2) => 1 2
4; 2nd and 3rd car         (1 20 30 4) => 20 30

ただし、この擬似コードを再帰的に実装できる方法を思い付くことはできません。

編集:誰かがまだ助けてくれるかどうかはわかりませんが、奇数リストの中央値インデックス値を取得する反復手順を作成することになりました。私の問題は、コードを偶数リストで機能させるものと、リストの値を返さないものを実装することです。

(define (median-index-odd lst)
    (define (median-index-iter1 lst times_carred)
        (if (null? lst)
           '()
            (if (= times_carred (/ (+ (length lst) 1) 2)) 
                (list (car lst))            
                (median-index-iter1 (cdr lst) (+ 1 times_carred)))))
                (median-index-iter1 lst 0))

リストが偶数の場合に中央値インデックスを見つけるための別の手順も思いつきました。

(define (median-index-even lst)
    (define (median-index-iter2 lst times_carred)
        (if (null? lst)
           '()
            (if (= times_carred (/ (length lst) 2)) 
                (list (car lst) (cadr lst))            
                (median-index-iter2 (cdr lst) (+ 1 times_carred)))))
                (median-index-iter2 lst 0))
4

2 に答える 2

0
(define (median L)
 (if (null? L)
     (error "No median of empty list")
     (let loop ((L1 L) (L2 L))
       (cond ((null? (cdr L2)) (car L1))
             ((null? (cddr L2)) (list (car L1) (cadr L1)))
             (else (loop (cdr L1) (cddr L2))))))

2 つのリストに分割すると、一度に最初のリストが取得され、次のリストが一度に 2 つ取得されます

于 2013-10-28T20:07:47.620 に答える