最簡單和常見的數(shù)學歸納法是證明當n等于任意一個自然數(shù)時某命題成立。
證明分下面兩步:
- 證明當n = 1時命題成立。
- 證明如果在n = m時命題成立,那么可以推導出在n = m+1時命題也成立。(m代表任意自然數(shù))
這種方法的原理在于:首先證明在某個起點值時命題成立,然后證明從一個值到下一個值的過程有效。當這兩點都已經(jīng)證明,那么任意值都可以通過反復使用這個方法推導出來。把這個方法想成多米諾效應也許更容易理解一些。例如:你有一列很長的直立著的多米諾骨牌,如果你可以:
- 證明第一張骨牌會倒。
- 證明只要任意一張骨牌倒了,那么與其相鄰的下一張骨牌也會倒。
那么便可以下結(jié)論:所有的骨牌都會倒下。
例如:等差數(shù)列求和公式:
1 + 2 + 3 + ··· + n = n (n+1) / 2
根據(jù)數(shù)學歸納法,這個問題應該這樣證明:
- 當n = 1時,1 = 1 * 2 / 2成立;
- 假設n = n - 1時,1 + 2 + 3 + ··· + (n - 1) = (n - 1) n / 2成立,那么
原式左 = 1 + 2 + 3 + ··· + (n - 1) + n
= (n - 1) n / 2 + n
= n (n+1) / 2
= 原式右- 得證。
為什么要說這個呢?
其實在程序設計中,遞歸就用到了這個思想。
如果將上例運用遞歸用編程語言寫出來如下:
public int sum(int n){
if(n < 1){
return -1;
}
if(n == 1){
return 1;
}
//假設n - 1成立,這是一般的情況。
//在代碼書寫中,先將一般的情況寫出來構建出遞歸的框架,然后再去排除特殊的情況,以便完成遞歸。
return sum(n - 1) + n;
}
可以發(fā)現(xiàn),這段代碼將數(shù)學歸納法的思想恰當?shù)捏w現(xiàn)了出來。
最后我們總結(jié)一下遞歸代碼的書寫方法:
遞歸書寫方法:
- 嚴格定義遞歸函數(shù)作用,包括參數(shù),返回值,side-effect
- 先一般,后特殊
- 每次遞歸必須縮小問題規(guī)模
- 每次問題縮小規(guī)模程度必須為1