リスト反転

目を潤ませてこっちをみないでくれ。
京アニ智代アフターをBGVにしてたら死にそうだ。何このソープ。もうやだ。
俺は信じません。


リスト反転は標準装備だけど練習

;;;だいぶなれてきたがしんどいな
(define (reverse-tail ls)
  (let loop((ls ls)
            (rls '())
            (tmp '())
            );ls:対象 rls:反転 tmp:反復用
     ;lsがもはや空なら反転させたrlsを出力して抜ける抜ける
     (if (null? ls)
         rls
         (begin
           (set! tmp (cdr ls)) ;次のステップのためにとりあえずcdrをtmpにいれておく。
           (set-cdr! ls rls)
           (loop tmp ls '() )
           )
         )
     )
  )

;ぐちゃぐちゃや。たぶんbeginいらん。ついでにtmpが迂遠
(define (reverse-tail2 ls)
  (let loop((ls ls)
            (rls '())
            ;(tmp '())
            );ls:対象 rls:反転 tmp:反復用
     ;lsがもはや空なら反転させたrlsを出力して抜ける抜ける
     (if (null? ls)
         rls
;       (begin
         (let ((tmp '() ))
           (set! tmp (cdr ls)) ;次のステップのためにとりあえずcdrをtmpにいれておく。
           (set-cdr! ls rls)
           (loop tmp ls )))
     )
  )

;;;清書
(define (reverse-tail3 ls)
  (let loop((ls ls) (rls '()));ls:対象 rls:反転
     (if (null? ls) rls    ;lsがもはや空なら反転させたrlsを出力して抜ける抜ける
         (let ((tmp '() )) ;tmp:反復用
           (set! tmp (cdr ls)) ;次のステップのためにとりあえずcdrをtmpにいれておく。
           (set-cdr! ls rls)
           (loop tmp ls )))))

;;;確認
(reverse-tail '(1 2 3 4 5)) ;ok
(reverse-tail2 '(1 2 3 4 5)) ;ok
(reverse-tail3 '(1 2 3 4 5)) ;ok
;define,名前付きlet,set!,set-cdr!,再帰とかその辺か

updated Fri Jul 18 12:54:11 2008