0

私はこれを調べていて、リストの最後に「何か」を追加できますが、私が到達している問題は、具体的には、同じリストの最後にリストの最初の要素を追加することです。

例えば:

{1、2、3、4}は{1、2、3、4、1}になります。

これが私が問題を抱えているコードです:

(define (copy-first-to-end lst)
  (cond [(empty? lst)   
         (cons (first lst) empty)]       
        [else  (cons (first lst)    
               (copy-first-to-end (rest lst)))])) 

このコードの問題は、空の場合は?条件では、応答は(最初のlst)を呼び出しますが、再帰的であるため、このリストの最初の要素は空です。スキームは動的に型付けされているため、最初の要素をどこにも格納できません(少なくとも、格納できるとは思いません)。

基本的なリスト機能のみを使用して、これを機能させるにはどうすればよいですか?(例:短所、短所?、空?最初、最後、残り)

4

2 に答える 2

2

クロージャーを使用して、必要なものを何でも保存できます。

これが私が書いた解決策ですが、考える余地を与えるためにいくつかの詳細が削除されています。:-)

(define (copy-first-to-end lst)
  (define top ???)
  (define (inner lst)
    (if (null? lst) ???
        (cons ??? (inner ???))))
  (inner ???))

この場合、inner特に、変数にアクセスできるクロージャーtopです (これを使用して、目的の値を隠します)。

于 2012-10-06T06:58:17.523 に答える
1

したがって、リストから最初の s 式を含むリストを追加するという特殊なケースを使用して、本質的に追加関数の独自の実装を作成しようとしています。あなたの問題は、フラットリストをフラットリストに変換して、結果として単一のフラットリストを取得できないことです。コンスでこれを行う唯一の方法は、最初のリストをその構成要素である s 式に分割し、それらを逆の順序で 2 番目のリストにコンスすることです。再帰により、これは簡単な作業になります。

(define (append-first-to-end lst)
  (define (append-to-end a lst)
    (if (null? (cdr lst)) ???
      (cons ??? (append-to-end a ???))))
  (append-to-end (car lst) lst))

私の例、Chris の例、そして私の冒頭のパラグラフの間で、空白を埋めることができるはずです。

lst から最終的な s 式を取得したら、必要なアクションが明らかであることを願っています...

于 2012-10-06T09:52:20.910 に答える