一个错误的使用数学归纳法的证明题剖析

题目:证明FibonacciF(n)=O(n)F(n)定义如下:

F(1)=1,F(2)=2,F(n)=F(n-1)+F(n-2)

证明:

n<=2时:F(1)=O(1),F(2)=O(2)

n大于2时,假设对于k<n成立。考虑nF(n)=F(n-1)+F(n-2)。由归纳法知,F(n-1)=O(n

-1),F(n-2)=O(n-2),所以F(n)=O((n-1)+(n-2))=O(n)

请问上述证明过程错在什么地方?

 

这是一本算法教材中的一个练习题。因为Fibonacci数明显是指数级的,所以这个证明肯定是错的。

这个证明错误的地方在于,它偷换了概念,其证明过程有岐义。

先复习一下大O记号的定义:

O记号表示渐近上界。对一个函数g(n),用O(g(n))表示一个函数的集合O(g(n))={f(n):存在正常数cN,使得对所有n>=N,有0<=f(n)<=cg(n)}

用这个定义来审查一下这个命题的初始证明过程:F(1)=O(1)F(2)=O(2),这两个命题本身肯定正确,但它们表示什么含义呢?大O记号表示式f(n)=O(g(n))中,O(g(n))是一个函数的集合,这个等号表示函数f(n)属于O(g(n))这个集合中。那么,将F(1)=O(1)这个式子来跟大O记号的定义对号入座,有f(n)=F(1)g(n)=1,所以,F(1)=O(1),它的意思是说F(1),F(1),…F(1),…这个无穷数列的上界是常数1,同理,F(2)=O(2)的意思是说,无穷数列F(2),F(2),…,F(2),…的上界是常数2

再看这个数学归纳法的证明过程中的归纳证明步骤。假设对于k<n成立,然后考虑n的情况。根据归纳假设,最终证明出了F(n)=O(n)。这个过程以及这个过程中所用的O(n-1)+O(n-2)=O(n),也完全正确。那么错误在什么地方呢?和对初始证明过程的分析一样,看这里的F(n)=O(n)表示什么。这个式子中的n已经不是一个变量了,这个时候n已经变成了一个常量。所以,我们同样地,用大O记号的定义来对号入座,为了与常量n区别,用x表示函数的自变量,有f(x)=F(n),g(x)=nf(x)=O(g(x))的实质就是F(n)=O(n),也就是说无穷数列:F(n),F(n),…,F(n),…的上界是n。这完全对,因为f(x)是一个常数数列,甚至可以说F(n)=O(1)是对的,只需要让正常数cn即可。

到这里,完全明白了这个证明的错误。它用一个完全正确的证明过程证明了一个毫不相干的结论。而我们真正想要的结论是:F(1),F(2),…,F(n),…这个数列的上界到底是一个什么情况。

关于数学归纳法的详细资料,可以在http://en.wikipedia.org/wiki/Mathematical_induction上学到。关于大O的详细资料以及扩展,同样可以在en.wikipedia.org上找到。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值