终止功能定义(算法)

时间:2016-04-03 12:30:21

标签: algorithm termination invariants loop-invariant

关于终止函数定义的问题。

我们有一个相对简单的函数来计算输入的⌊log2n⌋

LOG2
Configuration: {[r, n] | Integers r ≥ 0 and n ≥ 1}
[r, n] -> [r + 1, n/2] if n > 1 ∧ n even
[r, n] -> [r, n − 1] if n > 1 ∧ n odd

我们被问到一些终止函数μ(r,n)是否正确。

  • μ(r,n)= n 是正确的:函数的结束条件是 n = 1 ,因为那时 r = ⌊log₂n⌋⌋

  • 然而,μ(r,n)= 2n + r 显然也是正确的。

  • 此外,μ(r,n)= n + r 不正确

我理解终止函数μ(r,n)只是函数终止所依赖的变量,(在这种情况下 n 达到1 ,)那么为什么 2n + r 是一个终止函数?

在此上下文中,终止函数μ(r,n)的确切定义是什么?

1 个答案:

答案 0 :(得分:1)

对于进入循环的状态,终止函数μ必须为正,并且每次迭代都严格减少。那,加上自然数的有序性确保你的循环总是终止。 (注意,不要求μ(s)= 1 s 退出循环,只是它每次迭代总是减少。)

选择μ(r,n)= n + r 的问题是 n = 2 的问题,我们有

  • n 甚至
  • n> 1

因此转换[r, n] -> [r + 1, n / 2]有效。但是,在这种情况下,我们有

μ(r',n') =         Definition of r' and n'
μ(r+1,n/2) =       Definition of μ
r + 1 + n/2 =      Rearrange via n = 2
r + 2 = 
r + n =            Definition of μ
μ(r, n)

所以μ并没有严格降低。