- ループを使わずに配列を逆にするヤツ - D-6 [相変わらず根無し]
- ループを使わずに配列の順序を逆にする - ゲームが作れるようになるまでがんばる日記
- ループを使わずに配列の順序を逆にしてみた - ブログ(笑) - wanna be an early adopter -
- 窓際プログラマーの独り言 -C#の話題を中心に:僕も「ループを使わずに配列の順序を逆にする」を書いてみた
でも取り合えず書いてみます。
配列じゃなくてlistですけど。
reverse使えば良いじゃん。
; reverse(define (my-reverse ls) (reverse ls)) (my-reverse '(1 2 3)) ; -> (3 2 1) |
というわけにもいかないでしょうからfold。
; fold(define (my-reverse ls) (fold cons '() ls)) (my-reverse '(1 2 3 4 5)) ;-> (5 4 3 2 1) |
foldもなんとなく反則くさいので、letrecで末尾再帰呼び出し。
; recur(define (my-reverse ls) (letrec ((rev (lambda (ret l) (if (null? l) ret (rev (cons (car l) ret) (cdr l)))))) (rev '() ls))) (my-reverse '(a b c)) ; -> (c b a) |
これだと芸がないので、何かないかなー・・・。ということでY Combinator。
; y combinator(define (my-reverse ls) (((lambda (f) (f f)) (lambda (f) (lambda (ret l) (if (null? l) ret ((f f)(cons (car l) ret)(cdr l)))))) '() ls)) (my-reverse '(a b c)) ; -> (c b a) |
letrecで良いじゃん・・・ですよね。
芸がない。
追記
なんだ、元ネタはこれか。
再帰、再帰、再帰なSchemeでは、入門書の1章とか2章で出てきそうな問題。
他の問題は流行ってないのかな?
素数のはSICPの1章でやった覚えがある。
0 件のコメント:
コメントを投稿