2008년 03월 05일
파스칼의 삼각형 in Erlang

어제 erlangstudy 메일링리스트에 파스칼 삼각형 구현이 올라왔다. 요즘 프로그래밍을 너무 안해서 늦은 시각에도 불구하고 한 번 풀어봤다.
첫 번째 구현.
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]).
두 번째 구현. lists:foldl을 이용해서 코드를 더 줄였다. 함수 선언할 때 이름 중복 제거.
next(S) ->
lists:foldl(fun(A,[B|L]) ->
[A,A+B|L]
end, [0], S).
triangle(N) ->
lists:reverse(lists:foldl(fun(_,[S|_]=Acc) ->
[next(S)|Acc]
end, [[1]], lists:seq(1, N)))
저번의 조합, 순열 구현에서도 느꼈지만 수학 개념들을 프로그램으로 짜보면서 성질을 조금 더 이해할 수 있게 되었다. 꼭 실용적인 프로그램이 아니더라도 중고등학교 때 배웠는데 몰랐던 개념들을 알게 되니 기쁘다 ^^
# by | 2008/03/05 22:58 | Erlang | 트랙백(1) | 덧글(5)







☞ 내 이글루에 이 글과 관련된 글 쓰기 (트랙백 보내기) [도움말]
제목 : SICP : 연습문제 1.12
파스칼의 세모꼴 수를 만드는 프로시저 작성하기 (되도는 프로세스) 일단 파스칼의 세모꼴 수를 함수를 다음과 같이 정의해보았다. 1 => f(1, 1)1 1 => f(2, 1) f(2, 2)1 2 1 =......more
(아침에 출근해서 올리신 거 보고 깜짝 놀랬어요. 코드도 코드지만.. 시간이..-_-;;)
There is __a__ better way to do it.