算法的正确性

时间:2015-03-05 01:19:48

标签: algorithm recursion induction

该算法旨在计算任何正整数m,n的m ^ n。如何通过n上的归纳显示该算法的正确性。

long exp(long m, int n) {

if(n == 0) return 1;

if(n == 1) return m;

if(n % 2 == 0) return exp(m*m, n/2); 

else return exp(m*m, n/2) * m;

}

1 个答案:

答案 0 :(得分:0)

P(i)成为声明:

  

exp(m, i)计算任何整数m

的m i

对于基本情况,显然P(0)为真,因为我们有exp(m, 0) = 1 = m^0

对于归纳步​​骤,我们假设P(0), P(1), ..., P(k-1)都是正确的,我们声称P(k)也是正确的。我们必须考虑以下三种情况:

1。)如果k = 1,那么P(1)显然是正确的,因为我们有exp(m, 1) = m = m^1;

2。)如果k > 1k % 2 == 0,那么根据exp的定义我们有:

exp(m, k) = exp(m * m, k / 2)

根据归纳假设,我们有exp(m * m, k / 2) = (m * m)^(k / 2) = m^k,因此P(k)在这种情况下是正确的。

3。)如果k > 1k % 2 == 1,那么根据exp的定义我们有:

exp(m, k) = exp(m * m, k / 2) * m

通过归纳假设,我们得到exp(m * m, k / 2) = (m * m)^(k / 2)。自k % 2 == 1起,我们就k / 2 = (k - 1) / 2了。因此我们有:

exp(m * m, k / 2) = (m * m)^(k / 2) = (m * m)^((k-1) / 2) = m^(k-1)

因此:

exp(m, k) = exp(m * m, k / 2) * m = m^k

所以P(k)在这种情况下也是如此。