遞迴是種思想,不是演算法。
乙個演算法,你用遞迴去實現,它就是遞迴演算法;你用迴圈去實現,它就是非遞迴演算法。遞迴與迴圈一一對應,大多數程式語言都支援迴圈,但不一定支援遞迴。
乙個大問題,分解成類似的小問題,遞迴只用一句話就能描述這些「重複工作」,**那叫乙個簡單!想想這句話的威力都覺得很牛b!
遞迴演算法簡單而又經典的例子有:n!、
fibonacci
、hanoi
、回溯、樹遍歷、圖搜尋。敲**的時候,遞迴反映為
func()
裡呼叫func()
,當然傳入的形參是不一樣的,而且遞迴必須要有
exit door
(不然遞迴到哪天才是個頭呀,一直往深了遞迴,
stack
非給溢位不可,通常
100層以上的遞迴就會
overflow
了)。遞迴演算法其實是低效的,每次遞迴到下一層,系統都要為這一層記錄返回位址、區域性變數開闢
stack
空間,返回上一層的時候系統還要花時間刪掉這些東東,系統真累!
下面看一下
honoi
示例:#include
void move(char x,char y)
main()
void hanoi(int n,char one,char two,char three)
} /*n>=2
時,移動分三步:
step1: 把a
上的n-1
個圓盤移到b上;
step2: 把a
上的乙個圓盤移到c上;
step3: 把b
上的n-1
個圓盤移到c上;
*/迴圈與遞迴是一對一的,下面給出最簡單的示例:
int n=5;
int a=;
int main()
int sum2(int n)
假如你把演算法設計成了遞迴形式,再用
stack
去模擬消遞迴,效果不一定就好,你只是做了系統做的事情。所以,不要盲目相信非遞迴演算法就比遞迴演算法效率高,如果消遞迴技術不好,效率還不及原來的呢。
做些練習鞏固一下吧,用遞迴的方法完成:
1. 求陣列中的最大數
2. 求
n個整數的積
3. 求
n個整數的平均值
4. 求
n個自然數的最大公約數與最小公倍數
5. 有一對雌雄兔
,每兩個月就繁殖雌雄各一對兔子.問
n個月後共有多少對兔子?
6. 已知:數列
1,1,2,4,7,13,24,44,...
求數列的第n項
. 第6
題解答:
#include
int main() ;
scanf("%d",&n);
int tem=sum(n);
printf("%d/n",tem);
return 0; }
int sum(int n)
ø遞迴生成所有全排列實現1
:#include
#include
#include
bool used[100];
char a[100],n,c[100];
int main()
int f(int dep),
全排列為
perm(p)
,pn = p -
。因此perm(p) = r1perm(p1), r2perm(p2), r3perm(p3), ... , rnperm(pn)
。#include
int n = 0;
void swap(int *a, int *b)
int main()
;perm(list, 0, 4);
printf("total:%d/n", n);
return 0;
}void perm(int list, int k, int m)
else
} }
並不是嚴格字典序的哦,例如
12345
,12354
,12435
,12453
,「12543
,12534」…
深入淺出之揹包演算法 動態規劃是如何打敗遞迴的?
揹包問題 knapsackproblem 是一種組合優化的 np完全問題 問題可以描述為 給定一組物品,每種物品都有自己的重量和 在限定的總重量內,我們如何選擇,才能使得物品的總 最高。這個問題涉及到了兩個條件 一是物品總的大小小於或等於揹包的大小,二是物品總的價值要盡量大。一.採用遞迴的回溯法 剛...
深入淺出sizeof
int佔 位元組,short佔 位元組 1.0 回答下列問題 答案在文章末尾 1.sizeof char 2.sizeof a 3.sizeof a 4.strlen a 如果你答對了全部四道題,那麼你可以不用細看下面關於sizeof的論述。如果你答錯了部分題目,那麼就跟著我來一起 關於sizeof...
深入淺出ShellExecute
ipconfig c log.txt應如何處理?二樓的朋友,開啟拔號網路這樣 shellexecute null,open c windows rundll32.exe shell32.dll,control rundll c windows system telephon.cpl null,sw ...