我正在尝试创建一个名为的过程,该过程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))