나는 정수 배열 A 을 입력으로 받아서 다른 배열 B = [A [0], A [0] + A [1], A [0] + A [1]을 생성하는 Haskell 함수를 구현하려고 시도했다. ] + A [2], ...]. Data.List의 scanl이 함수 (+)와 함께 사용될 수 있다는 것을 알고 있습니다. 내가 scanl의 소스 코드를보고 나서 두 번째 구현 (빠른 수행)을 썼습니다. 꼬리 재귀 적 임에도 불구하고 첫 번째 구현이 두 번째 구현과 비교해 왜 느린 지 알고 싶습니다. 위의 코드에 대한이 꼬리 재귀 Haskell 함수가 왜 느린가?
-- This function works slow.
ps s x [] = x
ps s x y = ps s' x' y'
where
s' = s + head y
x' = x ++ [s']
y' = tail y
-- This function works fast.
ps' s [] = []
ps' s y = [s'] ++ (ps' s' y')
where
s' = s + head y
y' = tail y
일부 세부 정보 :
구현 1 : 그것은 '는이'배열입니다
ps 0 [] a
으로 호출해야합니다.
구현 2 : 그것은 '는이'배열입니다
ps' 0 a
으로 호출해야합니다.
배열이 아닌 (링크 된) 목록을 다루고 있음에 유의하십시오. – duplode
그리고 '머리'와 '꼬리'는 악합니다. 왜 'ps'(y : ys) = s ': ps's 'ys s'= s + y'입니까? 훨씬 좋네요. – leftaroundabout