證明方法
一:歸納法
1. 證明基準情形,就是確定定理對於某個(某些)小的(通常是退化的)值的正確性。
2. 進行歸納假設,一般說來,這意味著定理對直到某個有限數k的所有情況都是成立的
3. 使用上述假設證明定理對於下乙個值(通常是k+1)也是成立的
二:反證法
1. 假設定理不成立
2. 證明基於上述假設導致已知性質或條件不成立,匯出矛盾,證明定理是成立的
什麼是遞迴?
當乙個函式用自身來定義,就稱為是遞迴函式。比如
int f(int x)
使用遞迴的基本法則:
1. 基準情形。必須總是有某些基準的情形,不需要使用遞迴就能求解。
2. 不斷推進。對於那些要被遞迴求解的情形,遞迴呼叫必須總能夠朝著乙個基準情形推進
3. 設計法則。假設所有的遞迴呼叫都能執行。
4. 合成效益法則。在求解乙個問題的同一例項時,切勿在不同的遞迴呼叫中做重複性的工作。
注:前三條法則是保證乙個遞迴呼叫正確執行的保證,而第四條是保證遞迴的效率。
遞迴的主要問題是隱藏的簿記開銷,但是靈活使用遞迴能寫出一些很精簡巧妙的**。下面通過乙個例子來說明,遞迴的妙用。
一. 最大的子串行和問題:給定整數a1, a2, a3, a4...an可能有負數,求最大子串行和。
例如對於輸入-2, 11,-4, 13, -5, -2,答案為20(從a2 到a4)
方法一:暴力求解(略)
方法二:遞迴求解
inline int max3(int a, int b, int c)
int maxsumrec(const vector& v, int left, int right)
int center=(left+right)/2;
int leftmaxsum=maxsumrec(v, left, center);
int rightmaxsum=maxsumrec(v, center+1, right);
int leftbordersum=0, leftmaxbordersum=0;
for(int i=center;i>=left;--i)
int rightbordersum=0, rightmaxbordersum=0;
for(int i=center+1;i<=right;++i)
return max3(leftmaxsum, rightmaxsum,rightmaxbordersum+leftmaxbordersum);
}int maxsubsum(const vectorv)
方法三:
int maxsubsum(const vector& v)
return maxsum;
}
從中我們可以看到遞迴可以提高效率,相對於方法三,第二種方法四一種比較有效的方法,下面是另外乙個使用遞迴的例子。
使用遞迴來高校求冪。
long pow(int x, int n)
遞迴是一種很好的思維方式,可以簡化編碼,是**更清晰,但是使用也得慎重,不要誤用遞迴,下面就是遞迴的典型誤用。
long fib(int n)
其時間複雜度為指數,明顯違反了遞迴使用的第四條準則,做了很多重複性的工作。
《資料結構與演算法分析》筆記1 準備知識
最近在看mark allen weiss的 資料結構與演算法分析 c語言描述版本,為了以後複習,將概要資訊記錄下來。多項式和 1 2 3 4 5 n n 1 n 2 定義 如果存在正常數c和n0使得當n n0時t n cf n 則記為t n o f n 代表t n 的增長率 f n 的增長率 定義 ...
大話資料結構閱讀筆記(1)
資料結構很重要,但對於非科班出身的程式設計師來說,熟練地掌握資料結構在程式設計中的應用是一件很困難的事,因為資料結構很抽象,有些演算法理解起來很困難,最近找了很多關於資料結構的書,決定再重溫一下程杰的 大話資料結構 記錄重要的資料結構知識筆記供自己和大家在以後的學習與程式設計時參考。資料 是描述客觀...
資料結構與演算法分析筆記(c ) 佇列ADT
像棧一樣,佇列 queue 也是表。然而,使用佇列時插入是在一端進行的,而刪除則是在另一端進行的。佇列的基本操作是 enqueue 入隊 它是在表的末端 稱為隊尾 插入乙個元素 dequeue 出隊 它是刪除 並返回 表的開頭 叫作隊頭 的元素。對於每乙個佇列資料結構,我們保留乙個陣列 theray...