C# 遞歸與非遞歸算法與數學公式


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# 冒泡排序

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM