2007년 05월 01일
3n + 1 Haskell 버전 -.-
Erlang과 별로 다르지 않게 만들었습니다.
근데 입력을 1000000으로 하면 스택 오버플로우 나버리네요. 속도도 얼랭 보다 느립니다. 하스켈 빠르다던데. 그래서 함수에 타입도 명시해주고, tail recursion 되게 하려고 step을 strict 버전으로 바꾸어 보고, maximum이 길이가 1000000인 리스트를 처리 못하길래 maximum도 strict 버전으로 구현해보고, maximum_step과 maximum을 합쳐서 strict 버전으로도 해봤는데 여전히 1000000만은 끝나지를 않는군요.
PS. 삽질해도 안된다... 하스켈 밉다. 왜 tail call optimization이 안되지...
step :: Int -> Int
step n = step n 1
where
step :: Int -> Int -> Int
step 1 acc = acc
step a acc | (rem a 2) == 0 = step (div a 2) (acc + 1)
| otherwise = step (3 * a + 1) (acc + 1)
maximum_step :: [Int] -> Int
maximum_step xs = maximum (map step xs)
main = putStrLn (show (maximum_step [1..1000000]))
근데 입력을 1000000으로 하면 스택 오버플로우 나버리네요. 속도도 얼랭 보다 느립니다. 하스켈 빠르다던데. 그래서 함수에 타입도 명시해주고, tail recursion 되게 하려고 step을 strict 버전으로 바꾸어 보고, maximum이 길이가 1000000인 리스트를 처리 못하길래 maximum도 strict 버전으로 구현해보고, maximum_step과 maximum을 합쳐서 strict 버전으로도 해봤는데 여전히 1000000만은 끝나지를 않는군요.
PS. 삽질해도 안된다... 하스켈 밉다. 왜 tail call optimization이 안되지...
# by | 2007/05/01 21:57 | Erlang | 트랙백(2) | 덧글(7)







☞ 내 이글루에 이 글과 관련된 글 쓰기 (트랙백 보내기) [도움말]
제목 : 3N + 1 병렬, 분산 버전
분산 버전은 컴퓨터 여러 대를 연결해서 테스트했으면 좋았을텐데 못해봤습니다. 다음에 얼랭 스터디 가면 해볼 수 있겠네요. 우선 얼랭쉘을 하나 실행합니다. juno:ProgrammingErlang eungju$ erl -name s1 -smp +S 2 Erlang (BEAM) emulator version 5.5.4 [source] [smp:2] [async-threads:0] [hipe] [kernel-poll:false] E......more
제목 : Colomarine 52 post
all about Colomarine and top news...more