ヒネリたくてもヒネれず、Y combinator で書くなどしました。
今回は、The Seasoned Schemer で出てきた let/cc を用いてやってみました。
(やっぱこれって「再帰じゃない」とは言い張れないような気がしてきました。うまいこと書けてないだけかな。)
取り合えず以下コード
ちなみに先日のものはこちら
追記
いやー読んでもよくわからないっす・・・。力不足ですはい^^;(define (my-reverse ls) (let/cc return (let ((r #f)) (let ((l ls) (acc '())) (let/cc continue (set! r continue)) (and (null? l) (return acc)) (set! acc (cons (car l) acc)) (set! l (cdr l)) (r '()))))) |
追記2
擬似コードも説明もわかりやすかったです。追記で書いたように、だいたい思った通りの動きのようで安心しました。でもやっぱりなんか異物感のようなものがありますねー・・・。@cametan_001さんの仰るように関数型的でないからなのでしょうか。
兎に角もっと書いてみる方が良さそうだなーという印象でした。
山崎です
返信削除prolog で差分リストを使ったリバースです。
述語の再帰だけで(スコーレム)関数は使っていないので、可逆的に利用可能
rev(X,X,Y,Y).
rev([A|X1],X2,Y1,Y2) :- rev(X1,X2,Y1,[A|Y2]).
実行結果
?- rev([1,2,3,4],[],R,[]).
R = [4, 3, 2, 1].
?- rev(R,[],[4,3,2,1],[]).
R = [1, 2, 3, 4] .
山崎先生
返信削除いやー・・・パッと見てもよくわかりませんし、動作もイメージできませんorz
Prologやると、これまた頭の作りが変わりそうですね!