zoukankan      html  css  js  c++  java
  • 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# 冒泡排序

  • 相关阅读:
    英特尔“硬盘内存一体化”首款产品正式发布,读写速度超千倍,存储密度扩充十倍
    程序员,你为什么值这么多钱?
    不懂程序看的明白《黑客帝国》吗?
    程序员的工作、学习与绩效
    架构设计师能力模型
    .net平台的MongoDB使用
    转载-30分钟搞定后台登录界面(103个后台PSD源文件、素材网站)
    XAF-DevExpress.ExpressApp.DC.Xpo.XpoTypeInfoSource 生成实体的过程-学习笔记
    谈谈敏捷开发
    XAF-由于try catch导致的性能问题一例
  • 原文地址:https://www.cnblogs.com/cang12138/p/7357796.html
Copyright © 2011-2022 走看看