我正在读这本书:算法设计手册,我有一个问题要理解,它是关于归纳假设的,所以我有这个伪代码:
Increment(y)
if y = 0
then return(1)
else if (y mod 2) = 1
then return(2 · Increment(⌊y/2⌋))
else
return(y + 1)
所以我必须通过数学归纳法来证明这段代码真的有效,第一部分很简单:
if y = 0
then return(1)
最后一个部分也很简单,就是偶数
else
return(y + 1)
但是中间的部分对我来说很难:
else if (y mod 2) = 1
then return(2 · Increment(⌊y/2⌋))
这本书的解释如下:
Now, the case of odd y (i.e. y = 2m + 1 for some integer m) can be dealt with as:
(y = 2m + 1; because 2m + 1 is equal to any odd number)//this is what i understand
= 2 · Increment(⌊(2m + 1)/2⌋)//(2m + 1)/2 = m + 1/2
= 2 · Increment(⌊m + 1/2⌋)//ok we get here, but how (m + 1/2) will be the "m" bellow?
= 2 · Increment(m)
= 2(m+1)
= 2m+2 =y+1
任何人都可以解释如何证明这种递归确实有效?以及如何通过数学归纳法来证明这一点。
发布于 2014-02-06 21:25:21
=2·增量(⌊m+ 1/2⌋) //ok,但是(m + 1/2)怎么会是"m“呢?
因为⌊m + 1/2⌋ = m
,就这么简单。(我猜你知道⌊m + 1/2⌋
的意思是floor(m + 1/2)
。
注意,m
是一个整数,如果1/2
是小数,那么floor(m+1/2)
就是m
。实际上,floor(m + x)
( 0 <= x < 1
)就是m
:向m
添加任何小数部分并不会改变floor()
的结果。
所以你得到了2 * Increment(m) = 2(m+1) = 2m+2 = (2m+1)+1 = y+1
更新:通过归纳法证明的非常类似。
回顾归纳证明的总体布局:首先,阐述归纳假设。然后,我们证明了这一假设适用于一个基本情况(通常,当n= 0,或n= 1)。最后,但同样重要的是,我们用这个假设证明,如果它对n
的某个值有效,那么它也适用于n+1
。由于假设适用于基本情况,而且由于我们表明(使用归纳步骤),如果它对n
有效,那么它适用于n+1
,那么对于大于或等于大小写值的每个值都必须是正确的。
假说
在这种具体情况下,我们的假设是,这一功能:
I(n) = 1 if n is 0
n+1 if n is even
2 * I(floor(n / 2)) otherwise
等于n+1
,也就是说,
I(n) = n+1
其中I(n)
只是Increment(n)
的一个简短的手写体符号。你也可以把这个假设看作是一套由三个数学陈述组成的集合(换句话说,假设在所述的条件下,这三个案例中的每一个都被评估为n+1
)。
基案例
基本情况是何时n = 0
。对于n = 0
,I(n)
计算为1
,即n+1
( n
为0),因此我们已经证明了该假设对n = 0
有效。
现在,我们要证明,如果我们的假设对n
有效,那么它适用于n+1
。
感应步进
如果I(n) = n+1
有效,那么I(n+1) = (n+1)+1
必须是真。基本上,我们是说,“好吧,如果I(n)
的计算结果是它的参数加1,那就意味着I(n+1)
必须是(n+1)+1
,这就是我们必须证明的:我们必须证明I(n+1) = (n+1)+1
。
现在,根据I(n)
的最初定义,我们有两种情况:要么是偶数,要么是奇数。
这一次,函数I
的参数是n+1
-让我们考虑这两种情况。
如果n+1
是偶数,根据I(n)
的定义,我们可以立即看到这个I(n+1) = (n+1)+1
。
如果n+1
是奇数,那么我们就知道n+1 = 2m+1
对某些整数m
,因为如果n+1
是奇数,那么n
是偶数,这意味着有一个整数m
小于n
,所以2m = n
。因此,我们可以将n+1
重写为2m+1
。
I(n+1) = I(2m + 1) =
= 2 * I(floor((2m+1) / 2)) =
= 2 * I(floor(m + (1/2)) =
= 2 * I(floor(m)) = // we can remove 1/2 for the same reason
= 2 * I(m) =
= 2 * (m+1) = // inductive step; we used the hypothesis that I(n) = n+1
= 2*m + 2 =
= (2*m+1) + 1 =
= (n+1) + 1
这表明,如果这个命题对于floor(n/2)
是正确的(因为m
是n/2
),那么它也适用于n+1
。通过使用强感应,我们可以证明,如果这个命题对于所有的m,0 <= m <=n都是真的,那么对于n+1也是如此(见下面的注释)。
因此,实际上,I(n+1) = (n+1)+1
对于任何整数,假设 I(n) = n+1
是有效的。
我们证明,假设对n+1
有效,如果它对n
有效,我们也表明它对n = 0
有效。因此,它适用于n >= 0
。
发布于 2014-02-06 21:24:58
but how (m + 1/2) will be the "m" bellow?
1/2
导致C
中的商0
https://stackoverflow.com/questions/21614159
复制相似问题