Scheme中的函数中位数

时间:2014-11-26 01:24:42

标签: scheme

我是Scheme新手,我正在使用Dr.Racket试图找到列表的中位数。

如果列表L的长度是奇数,则函数median返回列表中的中值元素。如果L的长度是偶数,则函数median返回0。 示例

(median ‘(1)) returns 1
(median ‘(1 2)) returns 0
(median ‘(1 2 3)) returns 2
(median ‘( 1 2 3 4) returns 0

我只允许使用

- null?
- car
- cdr
- else
- = 
- +
- median
- cond
- if
- user defined names (for my variables)
- integer literals
- parentheses

有什么想法吗?

1 个答案:

答案 0 :(得分:2)

如果允许帮助程序内部过程,可以使用tortoise and hare algorithm解决此问题 - 我们需要传递两个参数才能使用。除此之外,所有限制都得到了强制执行:

(define (median lst)
  (define (median tortoise hare)
    (cond ((null? hare) 0)
          ((null? (cdr hare)) (car tortoise))
          (else (median (cdr tortoise) (cdr (cdr hare))))))
  (median lst lst))

按预期工作:

(median '(1))       ; returns 1
(median '(1 2))     ; returns 0
(median '(1 2 3))   ; returns 2
(median '(1 2 3 4)) ; returns 0