例の30minプログラミングから。
問題1
文字列 A と B があり、C を A+B とする。文字列を逆順にする関数 rev() をつかって、
rev(rev(A) + rev(B)) という操作をすると結果はどうなるか。
まず予想したあと、実際にプログラムを書いて確かめよ。
例: A="abcde"、B="1234"、C="abcde1234"
予想はC="1234abcde"
Schemeで書きました。
(define A "abcde") (define B "1234") (define rev-list (lambda (list new-list) (cond ((null? list) new-list) (else (rev-list (cdr list) (cons (car list) new-list)))))) (define rev (lambda (str) (cond ((null? str) null) (else (list->string (rev-list (string->list str) '())))))) (rev (string-append (rev A) (rev B))) ;1234abcde
# ハイライトされてないけど…
実行結果
http://ideone.com/oXJPh
# ideoneだとwriteしないとoutputに出なかったのでちょっと変えています。
rev()を使ってswapができますよという話でした。でも再帰向いてないですよね。
あとこの時の勉強会で、何割のプログラマが再帰を使ったプログラムが書けるかという話になり、9割、3割、1割、1%という意見が出ました。さあどれくらいいるでしょう。