我正在尝试创建一个名为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))
答案 0 :(得分:0)
好像是作业。
直截了当的解决方案包括list-sort
(rnrs / sorting
),除非它已经排序,length
获取列表长度,list-tail
以获取列表的一半{{1} }表示奇数,另外car
表示偶数列表。您可以使用cadr
对中间值执行某些操作。
在某些代码中进行编辑,即使您正确与否也是如此。对于后者,我们可以为您提供更多帮助。
答案 1 :(得分: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))))))
分成两个列表,一次取第一个,第二个一次