首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >数学归纳法,如何证明这个工作在这个递归函数中。

数学归纳法,如何证明这个工作在这个递归函数中。
EN

Stack Overflow用户
提问于 2014-02-06 21:13:47
回答 2查看 1.7K关注 0票数 6

我正在读这本书:算法设计手册,我有一个问题要理解,它是关于归纳假设的,所以我有这个伪代码:

代码语言:javascript
运行
复制
Increment(y)
  if y = 0 
    then return(1) 
 else if (y mod 2) = 1 
   then return(2 · Increment(⌊y/2⌋))
  else 
    return(y + 1)

所以我必须通过数学归纳法来证明这段代码真的有效,第一部分很简单:

代码语言:javascript
运行
复制
if y = 0 
    then return(1)

最后一个部分也很简单,就是偶数

代码语言:javascript
运行
复制
else 
    return(y + 1)

但是中间的部分对我来说很难:

代码语言:javascript
运行
复制
else if (y mod 2) = 1 
   then return(2 · Increment(⌊y/2⌋))

这本书的解释如下:

代码语言:javascript
运行
复制
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

任何人都可以解释如何证明这种递归确实有效?以及如何通过数学归纳法来证明这一点。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 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,那么对于大于或等于大小写值的每个值都必须是正确的。

假说

在这种具体情况下,我们的假设是,这一功能:

代码语言:javascript
运行
复制
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 = 0I(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

代码语言:javascript
运行
复制
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)是正确的(因为mn/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

票数 10
EN

Stack Overflow用户

发布于 2014-02-06 21:24:58

but how (m + 1/2) will be the "m" bellow?

1/2导致C中的商0

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21614159

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档