スキームは初めてですが、「リストの真ん中の要素」を取得する方法について誰かにアイデアを教えてもらえますか?
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)))))))
次の場合をカバーします。
- 空のリストが指定された場合、空のリストを返します。
- 奇数の要素を持つリストが与えられた場合、中央の要素を持つシングルトンリストを返します。
- 偶数の要素を含むリストが与えられた場合、2つの中央の要素を含むリストを返します。
- 循環リストが与えられた場合、を返します
#f
。 - 不適切なリスト(リスト以外を含む)が与えられた場合、鼻の悪魔を召喚します。
于 2012-11-09T12:43:57.797 に答える