【问题标题】:Implement primitive recursive factorial in haskell在haskell中实现原始递归阶乘
【发布时间】:2023-03-20 04:45:02
【问题描述】:

我目前正在尝试在 Haskell 中实现原始递归阶乘。 我正在使用函数 recNat 作为递归。那就是:

recNat :: a -> (Nat -> a -> a) -> Nat -> a
recNat a _ Zero = a
recNat a h (Succ n) = h n (recNat a h n)

这是我们的尝试,但无法完全找出问题所在

factR :: Nat -> Nat
factR Zero = Succ Zero
factR (Succ m) = recNat (Succ m) (\ _ y -> y) (factR m)

我也尝试实现指数函数,但似乎更令人困惑。

【问题讨论】:

  • 您想要乘法(如您的问题中所述)还是阶乘(如您的标题中所述)?
  • 阶乘!我的错误
  • 您的 lambda 忽略第一个参数,因此 recNat 调用将始终返回 (Succ m)。如果你想要一个原始的递归函数,你需要一种在递归堆栈上堆积Nat 增量的方法。

标签: function haskell recursion primitive


【解决方案1】:

为了实现阶乘,我们可以实现一个乘法函数。对于乘法函数,我们需要加法函数

data Nat = Zero | Succ Nat

add :: Nat -> Nat -> Nat
add a Zero     = a
add a (Succ b) = Succ (add a b)

mul :: Nat -> Nat -> Nat
mul a Zero     = Zero
mul a (Succ b) = add a (mul a b)

那么阶乘函数就归结为:

fac :: Nat -> Nat
fac Zero = Succ Zero
fac (Succ a) = mul (Succ a) (fac a)

【讨论】:

    猜你喜欢
    • 2023-03-25
    • 1970-01-01
    • 1970-01-01
    • 2016-01-28
    • 1970-01-01
    • 1970-01-01
    • 2015-04-19
    • 2019-08-06
    • 2019-07-24
    相关资源
    最近更新 更多