【问题标题】:Proving an algorithm correct by induction通过归纳证明算法正确
【发布时间】:2015-03-07 21:01:10
【问题描述】:

我应该通过归纳来证明一个算法,它返回 3n - 2n 对于所有 n >= 0。这是用 Eiffel 编写的算法。

P(n:INTEGER):INTEGER;
  do
    if n <= 1 then
        Result := n
    else
        Result := 5*P(n-1) - 6*P(n-2)
    end
  end

我的理解是你分三步证明。基本步骤、归纳假设和完整性证明。这是我目前拥有的。

依据:

P(0) 返回 0,并且 30 - 20 = 0。

P(1) 返回 1,并且 31 - 21 = 1。

归纳假设:

假设 P(k) 对于 0 k - 2k

完整性证明:

对于 n,P(n) 返回 5(P(n-1)) - 6(P(n-2))

5(P(n-1)) - 6(P(n-2))

5(3n-1 - 2n-1) - 6(3n-2 - 2n- 2)

这是我卡住的部分。我到底应该如何将其减少为 3n - 2n

【问题讨论】:

  • 不要过分强调,但代数应该可以工作。
  • 接下来的问题是:你怎么知道它是3^n - 2^n
  • @IVlad 给了它。
  • @Jimenemex:在你的程序中,你写了5*g(n-1) - 6*g(n-2)? g 是什么?
  • @geceo 确实如此。我的错。应该是 P(n)

标签: algorithm correctness induction eiffel proof-of-correctness


【解决方案1】:

使用 3n-1 = 3.3n-2 和 2n-1 = 2.2n-2 这个事实 :

5(3n-1 - 2n-1) - 6(3n-2 - 2n- 2)

= 15(3n-2) - 10(2n-2) - 6(3n-2) + 6 (2n-2)

= 9.3n-2 - 4.2n-2

= 3n - 2n

【讨论】:

    【解决方案2】:
      5(3^(n-1)-2^(n-1))-6(3^(n-2)-2^(n-2)) =
    = 5*3^(n-1)-5*2^(n-1)-6*3^(n-2)+6*2^(n-2) =
    = 5*3^(n-1)-5*2^(n-1)-2*3^(n-1)+3*2^(n-1) =
      --------- ========= --------- =========
    = 3*3^(n-1)-2*2^(n-1) = 
    = 3^n - 2^n
    

    【讨论】: