在证明算法的正确性时从哪里开始

时间:2015-12-29 03:47:11

标签: algorithm

我刚刚开始阅读算法设计手册,发现很难掌握如何证明算法的正确性。有人可以通过解释我提供的示例问题来帮助我。

证明以下递归算法的正确性乘以2 自然数,对于所有整数常数c≥2。

function multiply(y,z)
comment Return the product yz.
1. if z = 0 then return(0) else
2. return(multiply(cy, z/c) + y · (z mod c))

2 个答案:

答案 0 :(得分:5)

让我们正式说明我们要证明的内容:

For all integers y, z, we have multiply(y, z) = y · z.

对于递归算法,我们通常需要一个感应证明。这需要我们选择一个感应量,每次递归调用都会减少。在这里,我们可以使用|z|。归纳命题是

For all integers k ≥ 0, for all integers y, z such that |z| = k,
  we have multiply(y, z) = y · z.

基本情况是|z| = 0。这意味着z = 0,我们验证multiply(y, z) = 0if已被采用)和y · z = y · 0 = 0

归纳案例是|z| > 0else被采用,自c ≥ 2以来,我们知道|trunc(z / c)| < |z|,因此归因于归纳假设multiply(c · y, trunc(z / c)) = c · y · floor(z / c)。因此返回值

  c · y · trunc(z / c) + y · (z mod c)
= y · (c · trunc(z / c) + c · (z / c - trunc(z / c)))
= y · (c · z / c)
= y · z,

根据需要。

答案 1 :(得分:1)

通过递归z。

我们认为每个z&lt; K然后,K确实如此。

如果z = 0,则为真:乘(y,z)= 0(规则1)。

然后每个K都是如此。

案例1:z&lt; ç

然后z / c = 0,z%c = z

然后乘以(y,z)=乘(cy,z / c)+ y·(z mod c))(规则2)。

=乘(cy,0)+ y·z = 0 + y。 z = y。 z TRUE

案例2:z&gt; = c

然后z / c&lt; z(因为c> = 2)

然后乘以(y,z)=乘(cy,z / c)+ y·(z mod c))(规则2)。

= cy。 (z / c)+ y。 (z mod c)(RECURSION)

= y。 (c。(z / c)+ z mod c)

但是c。 (z / c)+ z mod c = z(mod的定义)

然后乘以(y,z)= y。 z结束了。