아래의 두 가지 기능을 고려하십시오. DP 캐시 히트 또는 누락을 표시하기 위해 traceShow
이 포함되었습니다. 첫 번째 것은 MemoCombinators documentation에서 파종되었습니다. 두 번째는 나 자신을 만들었다.Data.Memocombinators가 여분의 변수가있을 때 사례를 잡아 내지 못함
import Data.MemoCombinators as Memo
import Debug.Trace
fib :: Int -> Int
fib = Memo.integral fib'
where
fib' :: Int -> Int
fib' 0 = traceShow 0 $ 0
fib' 1 = traceShow 1 $ 1
fib' n = traceShow n $ fib (n-1) + fib (n-2)
brokenFib :: a -> Int -> Int
brokenFib a = Memo.integral brokenFib'
where
brokenFib' :: Int -> Int
brokenFib' 0 = traceShow 0 $ 0
brokenFib' 1 = traceShow 1 $ 1
brokenFib' n = traceShow n $ brokenFib [] (n-1) + brokenFib [] (n-2)
fib
는 DP를 활용하지만, 여분의 변수가 어떻게 든 그것을 엉망으로해야 의미하지 brokenFib
않습니다. 두 인수 함수의 인수 중 하나만을 DP로 지정하려는 시나리오를 작성하는 것은 어렵지 않지만 추가 변수가 brokenFib
을 어지럽히는 방법을 찾지 않고는 수행 할 수 없습니다. 어떤 충고?
편집 : user6655594 @에 의해 주어진 두 번째 솔루션의
구현 : 그것은 하나 DP를 잡을하지 않습니다
brokenFib :: a -> Int -> Int
brokenFib = Memo.memoSecond Memo.integral brokenFib'
where
brokenFib' :: a -> Int -> Int
brokenFib' _ 1 = traceShow 1 $ 1
brokenFib' _ 2 = traceShow 1 $ 1
brokenFib' _ n = traceShow n $ (brokenFib [] (n-1)) + brokenFib [] (n-2)
, 문서 ("함수의 두 번째 인수를 Memoize")이 시사하는 그것을해야합니다.
좀 더 현실적인 예를 제시 할 수 있습니까? 이것은 너무 간단합니다 (인수'a'는 어디에도 사용되지 않습니다). 그리고 당신이 실제로하고 싶은 것이 불분명합니다. –