0

私は単にスキームを調べていて、再帰のセクションにたどり着きました。

基本ケースが満たされたときに、Scheme が再帰プロシージャの「構築された」値を返し、基本ケースが に評価される原因となった実際の引数の値を返す理由がわかりません#t

たとえば、次のサンプル コード スニペットを見てください。これは、単語を入力として受け取り、それを逆にして、吐き出します。

(define (reverse wd)
  (if (empty? wd) wd
      (word (last wd) (reverse (bl wd)))))

これが私を混乱させるものです:(if (empty? wd) wd

仮パラメーターの実引数値wdが空 (または"") の場合、基本ケースが に評価され#t、2 番目の引数の値ifが評価されることを理解しています。

私が理解していないifのは、 ( wd、この場合) の 2 番目の引数が、基本ケースをトリガーした同じ空の仮パラメーターのように見えても、空ではない何かを返す方法です。

私は何が欠けていますか?

これを説明するドキュメント (またはテキスト) に何かがあれば、喜んでレビューします。

4

2 に答える 2

2

ここでは状態は変化しないため、関数が行うことを再帰で置き換えることができます。次の 2 文字の単語があるとしますa

(reverse a) ; =>
(word (last a) (reverse (bl a))) ; ==>
(word (last a) (word (last (bl a)) (reverse (bl (bl a))))) ; ==>
(word (last a) (word (last (bl a)) (bl (bl a)))) ; ==>
(word (last a) (word (last (bl a)) '()))

最後(bl (bl a))は最後の反復で行われた唯一のことであり、それは'(). 残りは、前の呼び出しの続きとして行われます。

編集

明確にするために.. aが「ab」であると想像してください

(reverse "ab") ; turns into
(word (last "ab") (reverse (bl "ab")))           ; tuns into
(word "b" (reverse (bl "ab")))                   ; turns into 
(word "b" (reverse "a")))                        ; turns into 
(word "b" (word (last "a") (reverse (bl "a"))))) ; turns into
(word "b" (word "a" (reverse ""))))

次に、最後のものを見てください. (reverse "")"" が返されたとき、それはフォーム内の前のフォーム呼び出しで使用された結果であるwordため、 を取得(word "a" "") ==> "a"し、それを実行する最初の呼び出しに返されます(word "b" "a")。これらは続きです。

于 2014-02-06T10:02:42.537 に答える