多数逻辑解码Haskell

0 logic haskell decoding

我必须计算正确解码位复制n次数的概率.以下公式应该是答案:

公式

在Haskell中,我将其编码如下:

fac 1 = 1
fac n = fac (n-1) * n
--prob :: (Integral b, Fractional b) => (b, b) -> b
--prob :: (Int,Int) -> Double
prob (n, k)
    | n==k = (0.01**k)
    | otherwise = factor (n, k) * (0.01 ** k) * (0.99**(n-k)) + prob (n, (k+1)) 
    where
        factor (n, k) = (fac n / ((fac k)* (fac n-k)))
Run Code Online (Sandbox Code Playgroud)

1 - prob (3,2)给出结果0.99992575,这是不正确的,应该是0.99970.有谁知道我哪里出错了?

小智 6

原因是功能优先.如果你看一下prob的定义,你会看到:

(fac n-k)
Run Code Online (Sandbox Code Playgroud)

因为函数应用程序具有最优先级,因此将其解析为

((fac n) - k)
Run Code Online (Sandbox Code Playgroud)

所以你的代码应该是

(fac (n-k))
Run Code Online (Sandbox Code Playgroud)

在我的电脑上得到0.999702的结果.