我是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
有什么想法吗?
答案 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