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)))))))

次の場合をカバーします。

  • 空のリストが指定された場合、空のリストを返します。
  • 奇数の要素を持つリストが与えられた場合、中央の要素を持つシングルトンリストを返します。
  • 偶数の要素を含むリストが与えられた場合、2つの中央の要素を含むリストを返します。
  • 循環リストが与えられた場合、を返します#f
  • 不適切なリスト(リスト以外を含む)が与えられた場合、鼻の悪魔を召喚します。
于 2012-11-09T12:43:57.797 に答える