어제 erlang study 메일링 리스트에서 Eungju님이 erlang으로 보여주신 코드가 있습니다.
-module(pascal).
-compile(export_all).
next(S) -> next(S, [1]).
next([_], Acc) -> [1|Acc];
next([A,B|L], Acc) -> next([B|L], [A+B|Acc]).
triangle(N) -> triangle(N - 1, [[1]]).
triangle(0, Acc) -> lists:reverse(Acc);
triangle(N, [S|L]) -> triangle(N - 1, [next(S),S|L]).
이건데요, 한 행 단위로 일을 처리하죠. 음, 그래서 행 단위로 - 라는 컨셉으로 제 나름대로 만들어 봤습니다. 그대로 옮긴건
아니고,
위에 있는 함수부터 차례로 만들다 보니 이렇게 되었군요. 하고나니 Eungju님 코드보다 훨 길어졌습니다. (역시 내공차
이... ㅎㄷㄷ)
(define (triangle n)
(map nth-row (seq 1 n)))
(define (seq start end)
(if (= start end)
(list start)
(cons start (seq (+ start 1) end ))))
(define (nth-row n)
(if (= n 1)
(list 1)
(next-row (nth-row (- n 1)))))
(define (next-row row)
(next (prepare row)))
(define (prepare row)
(append (cons 0 row) (list 0)))
(define (next row)
(if (> (length row) 1)
(cons (+ (car row) (car (cdr row))) (next (cdr row)))
[]))