【发布时间】:2012-11-09 10:48:30
【问题描述】:
我是 scheme 的新手,有人可以给我一些关于如何获取“列表中的中间元素”的想法吗?
【问题讨论】:
-
有趣的问题(特别是如果您只想遍历列表一次)。如果列表有偶数个元素会发生什么?如果列表为空应该怎么办?
标签: scheme
我是 scheme 的新手,有人可以给我一些关于如何获取“列表中的中间元素”的想法吗?
【问题讨论】:
标签: scheme
这是我的解决方案。它基于tortoise-and-hare algorithm(用于需要检测循环列表的任何类型的列表遍历),因此它不会比理智的列表遍历做更多的工作。 :-)
(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。【讨论】:
show 函数,相同的使用信息等。老实说,检查参数类型的最佳方法是通过Racket 的contracts。我不太了解合同,所以我无能为力。而且我绝对无法帮助您的课程使用show,因为这甚至不是标准的Scheme。
cond 中的第三种情况是必要的?我做了几个测试,第一个案例足以找到一个循环。能举个反例吗?