1、遞歸
遞歸:程序調用自身的編程技巧稱為遞歸(recursion)。
優點是:代碼簡潔,易於理解。
缺點是:運行效率較低。
遞歸思想:把問題分解成規模更小,但和原問題有着相同解法的問題。
1)下面是關於1+2+3+....+n的遞歸算法:
/// <summary> /// 1+2+3+....+n的遞歸算法 /// </summary> /// <param name="i"></param> /// <returns></returns> public static int Process1(int i) { //計算1+2+3+4+...+100的值 if (i == 0) return 0; return Process1(i - 1) + i; }
當i=3的時候,我覺得運算過程可能是這樣的(個人理解):
Process2(3- 1) + 3 =
Process2(2 - 1) + 2 + 3 =
Process2(1 - 1) + 1 + 2 + 3 =
最后結果:0 + 1 + 2 + 3 = 6
2)假設有50瓶飲料,喝完3個空瓶可以換一瓶,以此類推,請問總共喝了多少瓶飲料?
public static int Process1(int i,int num) { if (i / num == 0) return 0; return Process1(i / num + i % num, num) + i; }
其中 i=50,num=3。結果為:74瓶。
2、非遞歸
下面是用循環形式非遞歸代替上面的遞歸算法:
/// <summary> /// 1+2+3+....+n的非遞歸算法 /// </summary> /// <param name="isum"></param> /// <returns></returns> public static int Process2(int isum) { int sum = 0; for (int i = 1; i <= isum; i++) { sum += i; } return sum; }
3、公式
后來與同學討論,發現了更簡便的。
public static int Process3(int i) { //計算1+2+3+4+...+100的值 return i * (i + 1) / 2; }
數學果然很厲害,用了一個公式,既簡便又效率。
4、其他遞歸例子
(1) 斐波那契數列
/// <summary> /// 斐波那契數列遞歸算法,用於計算第i位的值 /// </summary> /// <param name="i"></param> /// <returns></returns> public static int Process(int i) {
//計算1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233.....第i列的值 if (i == 0) return 1; if (i == 1) return 1; return Process(i - 2) + Process(i - 1); }
(2)n的階乘
/// <summary> /// 1*2*3*....*n的遞歸算法 /// </summary> /// <param name="i"></param> /// <returns></returns> public static int Process(int i) { //計算1*2*3*...*n的值 if (i == 0) return 0; return Process(i - 1) * i; }
5、最后
下面分享個遞歸的實際例子(壓縮時,查找某個文件夾里所有的文件):C# 壓縮文件 ICSharpCode.SharpZipLib.dll
相關文章:C# 冒泡排序