1

最初のアイテムを削除して、リストをどのように更新しますか?

次の擬似コードを検討してください

define remover
(list = cdr list))

または、リストの最初のアイテムを削除するためのより推奨される方法はありますか?

4

3 に答える 3

1

注意してください!

リストのデータ構造自体はありません。lしたがって、リスト、、を取得して、の最初の要素を削除することはできませんl

リストが与えられたときにできることは、新しいリストが最初の要素を保持しないことを除いて、同じ要素を持つ新しいリストを作成するためlに使用することです。cdrl

もう少し詳しく:3つの値1、2、および、3を保持するリストはとして表され (cons 1 (cons 2 (cons 3 '()))ます。cons-cellsに名前を付けましょう:

       c3 = (cons 3 '()) 
       c2 = (cons 2 c3)
   l = c1 = (cons 1 c2)

最初に注意することは、リスト全体が値c1によって与えられるということです。cons-cell c1を操作して、リストから番号1を削除することはできません。ただし、最初の要素を省略したリストは簡単に見つけることができます。

   c2 = (cons 2 c3) = (cons 2 (cons 3 '())

したがって(cdr l) = (cdr c1) = c2、最初の要素を省略した新しいリストが生成されます。

于 2012-05-06T08:35:28.243 に答える
1

あなたはそれを釘付けにしました、ただ手順としてそれを書いてください:

(define (remover lst)
  (cdr l))

そして、次のように使用します(これにより、新しいバインディングが作成され、割り当てではありません):

(let ((new-list (remover old-list)))
  new-list)

またはこのように(これは新しいリストを定義します):

(define new-list (remover old-list))

いずれの場合も、パラメータとして渡された元のリストはremover変更されず、代わりに古いリストの最初の要素なしで新しいリストが返されることに注意してください。これが不変のリンクリストを操作する方法です。リストの変更がその場で行われると思い込まないでください。

于 2012-05-06T04:52:57.257 に答える
0

何をするか考えてくださいcdrcdrリストを返すことを忘れないでください。あなたの答えは近いです、あなたはただSchemeの構文と関数の観点からそれについて考える必要があります。

于 2012-05-06T04:51:59.297 に答える