我是计划的新手,有人可以给我一些关于如何获得“列表中的中间元素”的想法吗?
问问题
2218 次
1 回答
4
这是我的解决方案。它基于龟兔算法(用于需要检测循环列表的任何类型的列表遍历),因此它不会比正常的列表遍历做更多的工作。:-)
(define (middle-elements lst)
(if (null? lst) '()
(let loop ((tortoise lst)
(hare (cdr lst)))
(cond ((eq? tortoise hare) #f)
((null? hare) (list (car tortoise)))
((null? (cdr hare)) (list (car tortoise) (cadr tortoise)))
(else (loop (cdr tortoise) (cddr hare)))))))
它涵盖以下情况:
- 如果给定一个空列表,则返回一个空列表。
- 如果给定一个包含奇数个元素的列表,则返回一个包含中间元素的单例列表。
- 如果给定一个包含偶数个元素的列表,则返回一个包含两个中间元素的列表。
- 如果给定一个循环列表,则返回
#f
. - 如果给出不正确的列表(包括非列表),则召唤鼻恶魔。
于 2012-11-09T12:43:57.797 回答