을 하스켈?합 내가 m의 범위에서 정수의 제곱의 합을 해결하기 위해이 코드가
m : n 범위에 둘 이상의 숫자가있는 경우 범위 중간을 계산하고 (m : 중간)의 제곱 합을 제곱 합계 (중간 + 1 : n)에 더하고 그렇지 않으면 m : n 범위에 하나의 숫자 만 있으므로 m = = n이며 해는 m의 제곱입니다. (이 접근법에서는 재귀가 두 개의 하프 솔루션을 결합합니다. 즉, 각 하위 문제는 전반적인 문제의 크기의 약 절반입니다).
을 하스켈?합 내가 m의 범위에서 정수의 제곱의 합을 해결하기 위해이 코드가
m : n 범위에 둘 이상의 숫자가있는 경우 범위 중간을 계산하고 (m : 중간)의 제곱 합을 제곱 합계 (중간 + 1 : n)에 더하고 그렇지 않으면 m : n 범위에 하나의 숫자 만 있으므로 m = = n이며 해는 m의 제곱입니다. (이 접근법에서는 재귀가 두 개의 하프 솔루션을 결합합니다. 즉, 각 하위 문제는 전반적인 문제의 크기의 약 절반입니다).
원래 함수에서 유형 서명의 클래스 제약 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
로 작성한 수 물론, 왜 이런 변화를 원할 것인가? 한 가지 이유는 알고리즘을 병렬 처리에 맞게 준비 할 수 있다는 것입니다. 실제로 분할 및 정복은 종종 감소 및 정복보다 더 적합합니다.
중간에 필요한 것이 무엇인지 이해하지 못합니다. 사용하지 않고 사용 방법에 대한 설명에서 아무 것도 저장하지 않습니다. – jamshidh
[하스켈을 사용하는 사각형의 합] 가능한 복제본 (http://stackoverflow.com/questions/27407773/sum-of-squares-using-haskell) – Jubobs
다른 솔루션을 묻는 질문에 중복이 아닌 것 같습니다. 구조. –