【问题标题】:when the function will terminate函数何时终止
【发布时间】:2013-06-10 15:44:57
【问题描述】:
oops :: Integer -> Integer -> Integer
oops a b
   | a == 0 = b
   | otherwise = oops (a - 1) (b + 1)

oopser :: Integer -> Integer -> Integer
oopser a b
   | a == b = b
   | otherwise = oopser (a + 1) (b - 1)

上述两个函数会终止哪个值a和b?如果函数终止,那么对于 a 和 b 的值返回哪个值? (分别回答这两个功能的问题)...

在编程中,我们如何真正定义“终止”这个词??

【问题讨论】:

  • 如果我们将计算视为一个过程,我们可以识别它的开始,也可以识别它的结束。如果到达终点,我们称之为终止。如果我们将计算视为偏函数,则终止只是定义性。

标签: haskell terminate


【解决方案1】:

非终止意味着你调用了一个函数,而该函数永远不会返回一个值,你会一直等待它直到永远。现在你可以决定什么是你的永恒;)。

现在在您的特定情况下,这两个函数是递归函数,要知道递归函数是否会终止是检查“基本条件”(即递归函数不调用自身的条件)会不会遇到。

oops 中,基本条件是a == 0,并且在递归中,a 递减,所以如果您将 a 作为-1(或任何负数)传递给此函数,那么它将永远不会满足基本条件,因此永远不会终止。对于任何正数或零的 a,它将终止。

oopser 中类似,如果您传递任何大于 b 的值,它将永远不会终止。当您传递小于 b 或两者相等的 a 时,它将终止。

【讨论】:

  • 我有点困惑..因为终止意味着永远不会返回一个值,在“哎呀”中,如果我们将一个作为 -1(或任何负数)传递给这个函数,那么它永远不会满足基本条件,怎么能从不终止???
  • 准确地说,它永远不会终止。
  • @PeAcE:因为它会一直递归
  • @PeAcE: 是的,也就是说函数已经完成了它的工作,结果如下
猜你喜欢
  • 1970-01-01
  • 2020-05-22
  • 2017-12-01
  • 2014-03-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-29
相关资源
最近更新 更多