0

我正在尝试创建一个名为的过程,该过程median采用列表的中值。如果列表是偶数,那么我将返回中间的两个数字。我脑子里都想好了逻辑,但我不知道如何完成它。注意:我试图避免使用 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

好像是功课。

直接的解决方案包括list-sort( rnrs / sorting) ,除非它已经排序,length以获取列表长度,list-tail从一半和car奇数中获取列表,以及为偶数列表获取额外cadr的列表。你let用来做一些中间值的事情。

即使你做对了,也可以编辑一些代码。对于后者,我们可以为您提供更多帮助。

于 2013-10-28T09:45:34.390 回答
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))))))

分成两个列表一次取第一个,一次取第二个

于 2013-10-28T20:07:47.620 回答