2014-12-12 2 views
0

을 하스켈?합 내가 m의 범위에서 정수의 제곱의 합을 해결하기 위해이 코드가

m : n 범위에 둘 이상의 숫자가있는 경우 범위 중간을 계산하고 (m : 중간)의 제곱 합을 제곱 합계 (중간 + 1 : n)에 더하고 그렇지 않으면 m : n 범위에 하나의 숫자 만 있으므로 m = = n이며 해는 m의 제곱입니다. (이 접근법에서는 재귀가 두 개의 하프 솔루션을 결합합니다. 즉, 각 하위 문제는 전반적인 문제의 크기의 약 절반입니다).

+0

중간에 필요한 것이 무엇인지 이해하지 못합니다. 사용하지 않고 사용 방법에 대한 설명에서 아무 것도 저장하지 않습니다. – jamshidh

+0

[하스켈을 사용하는 사각형의 합] 가능한 복제본 (http://stackoverflow.com/questions/27407773/sum-of-squares-using-haskell) – Jubobs

+0

다른 솔루션을 묻는 질문에 중복이 아닌 것 같습니다. 구조. –

답변

3

원래 함수에서 유형 서명의 클래스 제약 Integral a은 더 이상 사용되지 않습니다. a은 서명의 다른 곳에 언급되지 않았습니까? 또한 함수의 세 번째 매개 변수 (middle)는 사용하지 않습니다.

sumsquares :: Int -> Int -> Int 
sumsquares m n 
    | m > n  = error "First number cannot be bigger than second number" 
    | m == n = m * m 
    | otherwise = let middle = (m + n) `div` 2 
       in sumsquares m middle + sumsquares (middle + 1) n 

질문을 : 따라서, 당신은 그럼 그냥 따라 재귀 경우 적응 포함 엄격한 분할 정복 방식에 decrease-and-conquer 체계에서 이동을 다시 쓰기

sumsquares :: Int -> Int -> Int 
sumsquares m n 
    | m > n  = error "First number cannot be bigger than second number" 
    | m == n = m * m 
    | otherwise = m * m + sumsquares (m + 1) n 

로 작성한 수 물론, 왜 이런 변화를 원할 것인가? 한 가지 이유는 알고리즘을 병렬 처리에 맞게 준비 할 수 있다는 것입니다. 실제로 분할 및 정복은 종종 감소 및 정복보다 더 적합합니다.

+0

ahhh 내가 무슨 뜻인지 알 수 있습니다. 계산을 보여주기 위해 어떻게 추적을 사용할 수 있습니까? – Harry

+1

@Harry :'Debug.Trace'를 사용하십시오; http://lpaste.net/116298을 참조하십시오. –

+0

@Harry Lists는 나쁘게 병렬 처리되므로 각 계산이 비싸다면 그렇게 할 수 있습니다. 이것은 여기에 해당하지 않으므로 목록 요소의 제곱을 합하는 가장 빠른 방법은 순차적으로 순서대로 수행하는 것입니다. – dfeuer

관련 문제