【问题标题】:why is my multiplication function in haskell not letting me multiply a float?为什么我在haskell中的乘法函数不允许我乘以浮点数?
【发布时间】:2020-08-28 15:28:25
【问题描述】:

这是我的乘法函数:

multiplicacion n 1 = n
multiplicacion n m = n + (multiplicacion n (m - 1)) 

适用于整数,但在尝试乘以浮点数时:

*Main> multiplicacion  4.1 4
16.4

这可行,但如果第二个参数也是浮点数,则会发生这种情况:

*Main> multiplicacion  4 4.1

函数中断。

【问题讨论】:

  • 请告诉我你期望它如何工作以及为什么。
  • 计算机正在按照您的指示进行操作
  • 尝试自己在头脑中或在纸上评估这一点 - 您很快就会发现问题所在。
  • 除了下面描述的问题之外,请注意Float 减法可能会引入舍入错误,这也可能使您错过基本情况。

标签: function haskell multiplication


【解决方案1】:

要查看发生了什么,请展开函数执行 - 即重复地将函数调用替换为其主体。

让我们考虑第一个例子:

multiplication 4.1 4
= 4.1 + (multiplication 4.1 (4 - 1))
= 4.1 + (4.1 + (multiplicaiton 4.1 (3 - 1))
= 4.1 + (4.1 + (4.1 + (multiplicaiton 4.1 (2 - 1)))
= 4.1 + (4.1 + (4.1 + 4.1)
= 16.4

现在我们来看第二个例子:

multiplication 4 4.1
= 4 + (multiplication 4 (4.1 - 1))
= 4 + (4 + (multiplication 4 (3.1 - 1)))
= 4 + (4 + (4 + (multiplication 4 (2.1 - 1))))
= 4 + (4 + (4 + (4 + (multiplication 4 (1.1 - 1)))))
= 4 + (4 + (4 + (4 + (4 + (multiplication 4 (0.1 - 1)))))
= 4 + (4 + (4 + (4 + (4 + (4 + (multiplication 4 (-0.9 - 1))))))
= 4 + (4 + (4 + (4 + (4 + (4 + (4 + (multiplication 4 (-1.9 - 1)))))))
= 4 + (4 + (4 + (4 + (4 + (4 + (4 + (4 + (multiplication 4 (-2.9 - 1))))))))
... and so on

第二个参数永远不会等于 1,因此第一个定义 multiplication n 1 = n 永远不会匹配,因此函数将永远调用自己。

您的函数只能乘以正整数。给它一个小数会导致无限循环。

【讨论】:

    【解决方案2】:

    问题是您每次调用都会将 m 减 1。那么让我们看看mult 4 4.1 会发生什么,展开每一行:

    mult 4 4.1
    4 + (mult 4 3.1)
    4 + (4 + (mult 4 2.1))
    4 + (4 + (4 + (mult 4 1.1)))
    4 + (4 + (4 + (4 + (mult 4 0.1)))))
    4 + (4 + (4 + (4 + (4 + (mult 4 (-0.9)))))))
    ...
    

    基于这个扩展,你能看出这里出了什么问题吗?因为在任何阶段m实际上等于1,你永远不会达到基本情况。

    【讨论】:

      猜你喜欢
      • 2011-03-03
      • 1970-01-01
      • 1970-01-01
      • 2018-01-04
      • 1970-01-01
      • 2021-05-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多