我刚刚开始阅读算法设计手册,发现很难掌握如何证明算法的正确性。有人可以通过解释我提供的示例问题来帮助我。
证明以下递归算法的正确性乘以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))
答案 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) = 0
(if
已被采用)和y · z = y · 0 = 0
。
归纳案例是|z| > 0
。 else
被采用,自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结束了。