顯然,分解容易(一分為二),組合難。
快速排序
剛剛分析過了,快速排序是樞軸記錄划分,也就是分解難,但是組合易。 A[1…k-1] ≤ A[k] ≤ A[k+1…n]


因為這些細節一般只影響常數因子的大小,不改變量級。求解時,先忽略細節,然后再決定其是否重要!
分析的方法
替換法

The master method(通用法,萬能法)
可迅速求解
遞歸通俗的說就是一個函數調用函數自己(本身),這個調用過程叫遞歸,遞歸是一把雙刃劍(有時方便,有時不好),如果需要處理重復的需要多次計算的問題,通常可以選擇用遞歸或者循環兩種方式,但是遞歸的執行效率不如循環語句。
注意:必須設置終止遞歸的條件檢測,否則慎用。
void up_and_down(int);//函數原型聲明
int main() { up_and_down(1);//調用遞歸函數
system("pause");
return 0; }
void up_and_down(int n) { printf("level%d, n地址=%p\n", n, &n); if (n < 4) { up_and_down(n + 1); } printf("LEVEL%d, n地址=%p\n", n, &n); }
首先,main函數用參數1調用遞歸函數,遞歸函數形參n=1,打印語句level1……然后,n<4,故函數本身使用參數n+1=2,第二次調用自己,這樣就打印了level2……
以此類推,當執行到第四級調用,n=4,if失效,不再調用函數,而是執行了第二句打印,先輸出LEVEL4……此時第四級調用結束,控制權返回給了主調函數,也就是第三級主調函數,此函數中上一句是if語句,已經執行完畢,然后繼續執行第二句打印語句,輸出LEVEL3……第三級調用結束,返回控制權給調用函數(也就是第二級主調函數),然后第二級函數開始繼續執行,以此類推,打印LEVEL2,1……
遞歸的基本原理
每一級遞歸都使用自己這一級的私有變量n,同級調用時的地址和返回的地址是一樣的。好好揣摩!
這是函數自己在一層層的往深度調用自己,然后一層層的往回返,每到一層,就繼續執行接下來的語句(故調用開始的地址和返回的地址一樣),而每一級遞歸都是用自己的局部變量。也就是第一級的n不同於第二級的n,這樣子,函數逐步調用然后逐步返回直到main函數里。
遞歸函數里,遞歸語句之前的語句和各級被調的遞歸函數執行順序一致,而遞歸語句之后的語句和被調的遞歸函數執行順序相反(這一特點針對涉及反向順序的編程問題很有用)
遞歸函數必須包含可以終止的條件,因為遞歸可以替代循環,故必須有終止
尾遞歸
最簡單的遞歸:遞歸語句放到函數末尾,恰在return語句前,叫做tail recursion(尾遞歸),因為出現在函數尾部,作用相當於一條循環語句。
//計算階乘(遞歸和循環) #include <stdio.h> #include <stdlib.h> //計算階乘 int factorial(int); int loopFactorial(int); int main() { int num; printf("輸入1-12的整數,q退出\n"); while (scanf_s("%d", &num)) { if (num < 0) { printf("error!輸入1-12的整數!"); } else if (num > 12) { printf("輸入1-12的整數!"); } else { printf("\n%d的階乘=%d", num, factorial(num)); printf("\n%d的階乘=%d", num, loopFactorial(num)); } printf("\n輸入1-12的整數"); } system("pause"); return 0; }
//循環計算階乘 int factorial(int n) { int temp; for (temp = 1; n > 1; n--) { temp *= n; } return temp; }
//使用遞歸計算階乘 int loopFactorial(int n) { int temp; if (n > 0) { temp = n * loopFactorial(n - 1);//屬於尾遞歸,如n>0那么這就是最后一句 } else { temp = 1;//必須要有遞歸結束判斷條件! } return temp; }
注意:整型范圍,32位機器,int類型最大到21多億,再大的話,就要用long long或者double類型,一般來說,選擇循環比較好些,遞歸每次調用都要有自己的變量集合,占據內存大,每次都要存儲新的變量集合到堆棧,這樣速度慢,但是遞歸(最簡單的是尾遞歸)比較簡單。一些情況還是要用。
歡迎關注
dashuai的博客是終身學習踐行者,大廠程序員,且專注於工作經驗、學習筆記的分享和日常吐槽,包括但不限於互聯網行業,附帶分享一些PDF電子書,資料,幫忙內推,歡迎拍磚!