回答を格納するためにアキュムレータを使用します。これにより、逆にリストを作成する効果があり ( 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 を渡すことを呼び出す別のプロシージャを作成するのは簡単です。'()