• 如鹏网.Net基础1 专题课:递归


    第 1 节  1-递归是什么?老和尚讲故事

      递归:方法自己调用自己。(必须有终止的条件)

      自己分析递归调用的过程

      每次调用方法,都会为方法创建一块内存空间,一个方法的两次调用就有两块内存空间,

      每冷色调用的局部变量是不互相影响的,都是独立的

    ------------------------------------------------
    第 2 节  2-递归案例:阶乘

      两个条件:

        1.递推方法;

        2.递归的终止条件(什么情况不再递归)

        阶乘:5!=5*4*3*2*1   f(n)=n*f(n-1)

            //递归:方法自己调用自己。两个条件:递推方法;递归的终止条件:什么情况下不再递归。
            //阶乘:5!=5*4*3*2*1。6!=6*5*4*3*2*1。f(n)=n*f(n-1)
            static int jiecheng(int n)
            {
                //把栈内存填满了
                //return n * jiecheng(n - 1);
                if (n < 0)
                {
                    throw new Exception("n不能是负数");
                }
                if (n == 0)
                {
                    return 1;
                }
                return n * jiecheng(n - 1);
            }

    ------------------------------------------------
    第 3 节  3-递归案例:斐波那契额数列

         //1,1,2,3,5,8,13,21.....第n位(从0开始)值是多少?斐波那契额数列
            //递推方法:f(n)=f(n-1)+f(n-2)。终止条件:n=0,1 return 1。
            static int fib(int n)
            {
                if (n < 0)
                {
                    throw new Exception("n不能是负数");
                }
                if (n == 0 || n == 1)
                {
                    return 1;
                }
                return fib(n - 1) + fib(n - 2);
            }

    ------------------------------------------------
    第 4 节  4-非递归算法

      static int jiecheng2(int n)
            {
                if (n < 0)//参数合法性校验是面试时候的加分项!
                {
                    throw new Exception("n不能是负数");
                }
                //n*(n-1)*(n-2)*1
                int result = 1;
                for (int i = 1; i <= n; i++)
                {
                    result = result * i;
                }
                return result;
            }
             
            static int fib2(int n)
            {
                if (n < 0)
                {
                    throw new Exception("n不能是负数");
                }
                if (n == 0||n==1)
                {
                    return 1;
                }
                int[] nums= new int[n+1];
                nums[0] = 1;
                nums[1] = 1;
                for (int i = 2; i < n + 1; i++)
                {
                    nums[i] = nums[i - 1] + nums[i - 2];
                    Console.WriteLine(string.Join(",",nums));//string.Join把一个集合用某个分隔符拼接起来,成为字符串
                }
     
                return nums[n];//取最后一个元素的值
            }

       缺点: 递归调用程序很多,效率很低,点内存很大(有的递归算法可以转换为非递归算法)

      参数合法性校验是面试时候的加分项;

      string.Join把一个集合用某个分隔符拼接起来,成为字符串

      面试重点为:阶乘和斐波那契数列的递归和非递归算法。(手写)

     

    如鹏网:http://www.rupeng.com

  • 相关阅读:
    Apache服务器的简单配置与安全策略
    Linux下的ICMP反弹后门:PRISM
    项目年度任务失败总结
    SpringBoot下配置Druid
    ftm国际化解决方案
    SpringBoot自动装配源码解析
    log4j到log4j2升级迁移方案
    Linux常用命令记录
    MySQL安装后无法用root用户访问的问题
    html实体命名
  • 原文地址:https://www.cnblogs.com/wjs5943283/p/5239202.html
Copyright © 2020-2023  润新知