zoukankan      html  css  js  c++  java
  • 20160422 --Switch…case 总结; 递归算法

    13

    2016-04-22  11:01:00

    1. Switch…case 总结网摘

    例题:

    Console.WriteLine("1.汉堡包");
                Console.WriteLine("2.薯条");
                Console.WriteLine("3.鸡块");
                Console.WriteLine("4.鸡腿");
                Console.WriteLine("5.鸡米花");
    
                Console.Write("请输入您的选择项目数字:");
                string a = Console.ReadLine();
    
                switch (a)
                {
                    case "1":
                        Console.WriteLine("您选择的是汉堡包!");
                        break;
                    case "2":
                        Console.WriteLine("您选择的是薯条!");
                        break;
                    case "3":
                        Console.WriteLine("您选择的是鸡块!");
                        break;
                    case "4":
                        Console.WriteLine("您选择的是鸡腿!");
                        break;
                    case "5":
                        Console.WriteLine("您选择的是鸡米花!");
                        break;
                    default:
                        Console.WriteLine("输入有误!");
                        break;
                }

    总结:switch语句和if语句的区别:

         

         大于等于(>=)、小于等于(<=)的判断用if语句,而等于(=)的判断用switch语句

         switch语句中的case类似于if…else…else if…else,但是离散值的判断。

           离散值的判断自认为是等于情况的判断)。

         switch一般都可以及用if重写,但是if不一定能用switch重写。

        不要忘了break.C#break不写是不行的,除了合并case的情况。

         case 中的值必须是常量,不能是变量、表达式。

    2.递归算法(网摘

    简介:

    在数学与计算机科学中,递归是指在函数的定义中使用函数自身的方法。
      递归算法是一种直接或者间接地调用自身算法的过程。在计算机编写程序中,递归算法对解决一大类问题是十分有效的,它往往使算法的描述简洁而且易于理解。
    递归算法解决问题的特点:
      (1) 递归就是在过程或函数里调用自身。
      (2) 在使用递归策略时,必须有一个明确的递归结束条件,称为递归出口。
      (3) 递归算法解题通常显得很简洁,但递归算法解题的运行效率较低。所以一般不提倡用递归算法设计程序。
      (4) 在递归调用的过程当中系统为每一层的返回点、局部量等开辟了栈来存储。递归次数过多容易造成栈溢出等。所以一般不提倡用递归算法设计程序。在实际编程中尤其要注意栈溢出问题。

      借助递归方法,我们可以把一个相对复杂的问题转化为一个与原问题相似的规模较小的问题来求解,递归方法只需少量的程序就可描述出解题过程所需要的多次重复计算,大大地减少了程序的代码量。但在带来便捷的同时,也会有一些缺点,也即:通常用递归方法的运行效率不高。

    【问题】 编写计算斐波那契(Fibonacci)数列的第n项函数fib(n)。 
    斐波那契数列为:0、1、1、2、3、……,即: 
    fib(0)=0; 
    fib(1)=1; 
    fib(n)=fib(n-1)+fib(n-2) (当n>1时)。 
    写成递归函数有: 
    int fib(int n) 
    { if (n==0) return 0; 
    if (n==1) return 1; 
    if (n>1) return fib(n-1)+fib(n-2); 

    递归算法的执行过程分递推和回归两个阶段。在递推阶段,把较复杂的问题(规模为n)的求解推到比原问题简单一些的问题(规模小于n)的求解。例如上例中,求解fib(n),把它推到求解fib(n-1)和fib(n-2)。也就是说,为计算fib(n),必须先计算fib(n-1)和fib(n-2),而计算fib(n-1)和fib(n-2),又必须先计算fib(n-3)和fib(n-4)。依次类推,直至计算fib(1)和fib(0),分别能立即得到结果1和0。在递推阶段,必须要有终止递归的情况。例如在函数fib中,当n为1和0的情况。 
    在回归阶段,当获得最简单情况的解后,逐级返回,依次得到稍复杂问题的解,例如得到fib(1)和fib(0)后,返回得到fib(2)的结果,……,在得到了fib(n-1)和fib(n-2)的结果后,返回得到fib(n)的结果。 
    在编写递归函数时要注意,函数中的局部变量和参数知识局限于当前调用层,当递推进入“简单问题”层时,原来层次上的参数和局部变量便被隐蔽起来。在一系列“简单问题”层,它们各有自己的参数和局部变量。 
    由于递归引起一系列的函数调用,并且可能会有一系列的重复计算,递归算法的执行效率相对较低。当某个递归算法能较方便地转换成递推算法时,通常按递推算法编写程序。例如上例计算斐波那契数列的第n项的函数fib(n)应采用递推算法,即从斐波那契数列的前两项出发,逐次由前两项计算出下一项,直至计算出要求的第n项。

    习题:

    1. 计算1+2+3+4+...+100的值

     static void Main(string[] args)
            {
                Console.WriteLine(Process2(100));
                Console.ReadLine();    
            }
            public static int Process2(int i)
            {
                //计算1+2+3+4+...+100的值
                if (i == 0) return 0;
                return Process2(i - 1) + i;
    
            }

    2. 计算1 -2 +3 +-4+ 5- 6 + 7 - 8 + 9的值

       static void Main(string[] args)
            {
    
                Console.WriteLine(Process3(9) - Process3(8));
                Console.ReadLine();  
            }
    
            public static int Process3(int i)
            {
                //计算1 -2 +3 +-4+ 5- 6 + 7 - 8 + 9的值
                if (i == 0) return 1;
                if (i == 1) return 2;
                else return Process3(i - 2) + i;
            }

    3.汉诺塔问题

      static void Main(string[] args)
            {
                Hanoi(5, 'A', 'B', 'C');
                Console.ReadLine();
            }
            public static void Hanoi(int n ,char A, char B, char C)
            {
                //汉诺塔问题
                //将n个盘子从A座借助B座,移到C座
                if (n == 1) Move(A, C);
                else
                {
                    Hanoi(n - 1, A, C, B);
                    Move(A, C);
                    Hanoi(n - 1, B, A, C);
                }
    
            }
            public static void Move(char startPlace, char endPlace)
            {
                Console.WriteLine("Move {0} To {1}",startPlace,endPlace);
            }

    4.一列数的规则如下: 1、1、2、3、5、8、13、21、34...... 求第30位数是多少

    1)递归算法实现

    Console.WriteLine(Foo(30));
            }
            public static int Foo(int i)
            {
                if (i <= 0)
                    return 0;
                else if (i > 0 && i <= 2)
                    return 1;
                else return Foo(i - 1) + Foo(i - 2);

    2)for 循环

       int a = 1, b = 1, c = 2;
                for (int j = 3; j <= 30; j++)
                {
                    c = a + b;
                    a = b;
                    b = c;
                }
                Console.WriteLine(c);

    3)while 循环

     int a = 1, b = 1, c = 2;
                int k = 3;
                while (k<=30)
                {
                    c = a + b;
                    a = b;
                    b = c;
                    k++;
                }
                Console.WriteLine(c);
  • 相关阅读:
    CodeForces 446A. DZY Loves Sequences(最长上升子序列)
    CodeForces
    2020牛客暑期多校训练营(第一场)
    POJ3281-Dining(最大流)(拆点)
    「杂题」图论杂题选做
    「学习小结」CDQ 分治多维偏序问题
    「算法笔记」Tarjan 算法 双连通分量
    「算法笔记」状压 DP
    「算法笔记」数位 DP
    「算法笔记」矩阵乘法
  • 原文地址:https://www.cnblogs.com/pangchunlei/p/5420491.html
Copyright © 2011-2022 走看看