Scheme 麻省理工学院方案中值程序

Scheme 麻省理工学院方案中值程序,scheme,median,mit-scheme,Scheme,Median,Mit Scheme,如果不使用list ref,您将如何定义查找列表中值的过程?例如,(中位数’(12))将返回2,(中位数’(123456))将返回3.5。您可以假设它是一个排序整数列表 这是一个家庭作业问题,所以请不要发布实际代码。我所寻找的只是一些提示或一些伪代码来帮助我朝着正确的方向前进。如标题所述,我正在使用麻省理工学院的方案。提前谢谢。你知道如何使用龟兔算法吗?如果是这样,在你的算法完成后,你的乌龟将在列表的中间 如果你真的被卡住了。或者,这里有一些类似伪代码的东西: (define (median l

如果不使用list ref,您将如何定义查找列表中值的过程?例如,
(中位数’(12))
将返回2,
(中位数’(123456))
将返回3.5。您可以假设它是一个排序整数列表


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

你知道如何使用龟兔算法吗?如果是这样,在你的算法完成后,你的乌龟将在列表的中间

如果你真的被卡住了。或者,这里有一些类似伪代码的东西:

(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
(定义(中间lst)
(如果(null?lst)#f;;oops,空列表
(让循环((乌龟)
(兔子)
(cond((eq?乌龟兔)#f);(oops,循环列表)
((null?hare));;此处为中值
((null?(cdr hare));;中间两个元素的平均值
(else(((()()));;;继续前进

如果中位数是列表中两个中间元素的平均值,则使用list ref将效率低下。原因是您将跳过列表的前半部分两次,以找到中间的两个元素

一种解决方案是编写一个helper函数
(drop list a-list n)
,用于删除列表中的第一个
n
元素。例如,
(下拉列表(abcde)2)
”(cde)
。使用
下拉列表
现在可以执行以下操作:

  • 查找列表的长度
  • 如果长度为奇数,则使用list ref拾取中间元素
  • 如果长度为偶数,请使用下拉列表将元素放在中间两个元素之前,然后计算结果前两个元素的平均值

  • 在玩了一会儿之后,我开始工作了。谢谢!我认为,作为一个家庭作业问题,禁止使用
    list ref
    与其说是为了提高效率,不如说是为了证明对龟兔算法的理解。:-)如果不知道他们在课堂上所学的内容,很难说。