【问题标题】:Using recursion in haskell在haskell中使用递归
【发布时间】:2017-01-21 01:51:20
【问题描述】:

大家好,我在 Haskell 有这个家庭作业,我们必须使用 Nat 数据类型,它只给出 ZeroSucc(n) 一个。所以一个是Succ(Zero),两个是Succ(Succ(Zero)),以此类推。我们还应该递归地加减乘这些数据类型。

其中一个问题是这样的

--Add two natural numbers.
--
--   `>>> add one two`
--   Succ (Succ (Succ Zero))
--
--   `>>> add Zero one == one`
--   True
--
--   `>>> add two two == four`
--   True
--
--   `>>> add two three == add three two`
--   True
--

我的问题是当我进行递归时,我有一个基本情况,但正如我所说的那样,它只是返回基本情况并且不会特别冒泡。

任何关于如何在 Haskell 中使用模式匹配递归的帮助或解释将不胜感激

编辑:我的代码是

add :: Nat -> Nat -> Nat
add Zero   Zero = Zero
add Zero   (Succ i) =  Succ(pred i)
add (Succ i) Zero = Succ(pred i)
add (Succ i) (Succ j) = Succ(add i j)

pred 是另一个函数

pred :: Nat -> Nat
pred Zero = Zero
pred (Succ Zero) = Zero
pred (Succ i) = Succ(pred i)

【问题讨论】:

  • 显示你目前拥有的代码。
  • 如果它只给你基本情况的结果,那听起来非基本情况只是重复出现而不对结果做任何事情,但你应该真正展示你的代码,所以我们可以告诉当然。

标签: haskell recursion


【解决方案1】:

这是一个分析:

add :: Nat -> Nat -> Nat

-- 0 + 0 = 0, looks good
add Zero   Zero = Zero

-- 0 + (1 + i) = 1 + (i - 1), wait, what?  No.
add Zero   (Succ i) =  Succ(pred i)

-- (1 + i) + 0 = 1 + (i - 1), again, no.
add (Succ i) Zero = Succ(pred i)

-- (1 + i) + (1 + j) = 1 + (i + j), no.
add (Succ i) (Succ j) = Succ(add i j)

你可以看到,当你把它翻译回普通代数时,问题就更明显了。

提示:你不需要打电话pred,你不需要超过两个案例。

另请注意,这是一种奇怪的格式:

Succ(pred i)
Succ(Zero)

Haskell 应该是这样的:

Succ (pred i)
Succ Zero

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-01-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-06
    • 1970-01-01
    • 2012-11-26
    • 1970-01-01
    相关资源
    最近更新 更多