如何在不使用list-ref的情况下定义查找列表中位数的过程?例如,(median '(1 2 2))
将返回2,(median '(1 2 3 4 5 6))
将返回3.5。您可以假设它是一个排序整数列表。
这是一个家庭作业问题,所以请不要发布实际代码。所有我正在寻找的是一些提示或一些伪代码,以帮助我朝着正确的方向。如标题中所述,我正在使用麻省理工学院计划。提前谢谢。
答案 0 :(得分:2)
你知道如何使用乌龟和野兔算法吗?如果是这样,在您的算法完成后,您的乌龟将位于列表的中间位置。
如果你真的卡住,I have a working implementation。或者,这里有一些伪代码:
(define (median lst)
(if (null? lst) #f ;; oops, empty list
(let loop ((tortoise <???>)
(hare <???>))
(cond ((eq? tortoise hare) #f) ;; oops, circular list
((null? hare) <???>) ;; median value here
((null? (cdr hare)) <???>) ;; average of middle two elements
(else (loop <???> <???>)))))) ;; keep going
答案 1 :(得分:0)
在中位数是列表中两个中间元素的平均值的情况下,使用list-ref将是低效的。原因是你会跳过列表的前半部分两次以找到两个中间元素。
一种解决方案是编写一个帮助函数(drop-list a-list n)
,它删除列表的第一个n
元素。例如。 (drop-list '(a b c d e) 2)
是'(c d e)
。使用drop-list
,您现在可以执行以下操作: