1

我是计划的新手,有人可以给我一些关于如何获得“列表中的中间元素”的想法吗?

4

1 回答 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 回答