factTD :: Int -> Int d :: Int -> Int -> Int factTD(x) -> d(x, 1) d(x, a) -> a | x<=0 d(x, a) -> d(x-1, a*x) | x>0 factRD :: Int -> Int factRD(x) -> 1 | x<=1 factRD(x) -> x*factRD(x-1) | x>1 taildown :: (Int -> Int -> Int) -> Int -> Int -> Int -> Int taildown(F, x, i, a) -> a | i < x taildown(F, x, i, a) -> taildown(F, x, i - 1, F(a,i)) | i ≥ x recdown :: (Int -> Int -> Int) -> Int -> Int -> Int -> Int recdown(F, x, i, a) -> a | i < x recdown(F, x, i, a) -> F(i, recdown(F, x, i - 1, a)) | i ≥ x