MIT Scheme中位程序

时间:2013-03-16 05:18:14

标签: scheme median mit-scheme

如何在不使用list-ref的情况下定义查找列表中位数的过程?例如,(median '(1 2 2))将返回2,(median '(1 2 3 4 5 6))将返回3.5。您可以假设它是一个排序整数列表。

这是一个家庭作业问题,所以请不要发布实际代码。所有我正在寻找的是一些提示或一些伪代码,以帮助我朝着正确的方向。如标题中所述,我正在使用麻省理工学院计划。提前谢谢。

2 个答案:

答案 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,您现在可以执行以下操作:

  1. 查找列表的长度
  2. 如果长度为奇数,则使用list-ref选择中间元素
  3. 如果长度是偶数,请使用drop-list删除两个中间元素之前的元素,然后计算结果前两个元素的平均值。