3

私はスキームの初心者です。誰かが「リストから奇妙な位置にある要素」を取得する方法についてアイデアを教えてもらえますか? そう( A B C D G )戻ります( G C A)。逆にリストを取得したので、1 つおきの番号を取得する必要があります。助けてください。これまでの私のコードは次のとおりです。

(define (list-rev lis)
  (COND
   ((NULL? lis ) '())
   ((LIST? lis)
    (append (oddrev (CDR lis)) ( list (CAR LIS))))
   (ELSE (show " USAGE: (oddrev [LIST])"))))
4

2 に答える 2

1

回答を格納するためにアキュムレータを使用します。これにより、逆にリストを作成する効果があり ( append! を使用する必要はありません)、末尾再帰ソリューションが生成されます。これは宿題のように見えるので、空欄を埋めるためのヒントをいくつか紹介します。

(define (odd-reverse lst acc)
  (cond ((null? lst)        ; if the list is null
         <???>)             ; return the empty list
        (<???>              ; if there's only one element left in the list
         (cons <???> acc))  ; cons that element with the accumulator
        (else               ; otherwise advance the recursion
         (odd-reverse <???> ; advance two positions over the list
                      (cons <???> acc))))) ; cons current element with the acc

次のように呼び出します。

(odd-reverse '(A B C D G) '())
=> '(G C A)

プロシージャが 1 つのパラメーター (リスト) のみを受け取る必要がある場合、アキュムレータの初期値としてodd-reverse常に a を渡すことを呼び出す別のプロシージャを作成するのは簡単です。'()

于 2012-11-09T19:45:59.330 に答える
1

1 つの方法は、リストとブール値の 2 つのパラメーターを受け取る関数を使用して、リストを 1 回パスすることです。

ブール値が true の場合cons、現在の要素と残りの処理済みリストが必要です。それ以外の場合は、現在の要素をスキップして続行できます。他のすべての要素を取得しているため、ブール値を毎回反転する必要があります。

それは役に立ちますか?


必要に応じてコードを次に示しますが、最初に自分で試してみることをお勧めします。

(define l '(A B C D G)) (define (orev lst acc) (if (null? lst) '() (if acc (cons (car lst) (orev (cdr lst) #f)) (orev (cdr lst) #t)))) (write (orev (reverse l) #t))

于 2012-11-09T19:35:00.207 に答える