zoukankan      html  css  js  c++  java
  • C# 递归

    本菜鸟刚刚看书看到递归了,发现解决某些问题的时候还是挺好的,所以把它弄出来学习一下。

    递归其实就是除了可以调用其他的方法,它还能调用它自己。它把大的问题转化为小的问题,再转化到最小解,然后再返回往上调用,得出解。同时,我在别的BLOG中看到几点要素和注意事项把它给拉过来记录一下:

    (1)递归操作的每两步都是有紧密的联系,如在“递归”的“归操作时”,前一次的输出就是后一次的输入。

    (2)必须要有结束递归的条件。

    (3)递归必须要有一个递归出口。

    (4)大规模的问题不适合递归,因为需要进栈出栈比较频繁,效率比较低,还容易造成栈溢出。

      比如最最常用的阶乘的问题,如果数字小的话就可以用递归来解决:

        int Factorial(int i) {
                if (i <= 1)
                    return i;
                else
                    return i * Factorial(i - 1);
    
            }
            static void Main(string[] args) {
                Program pro = new Program();
                Console.WriteLine(pro.Factorial(5));
            }

      上面的Factorial方法,每当调用自己的时候会有一个新的帧被压到栈里面去,所以如果数字大的话,很容易就造成栈的溢出,那就只能用其他的方法。

      下面有一个例子是这样的:

        static void Main(string[] args) {
                Program pro = new Program();
                pro.Test(3);
            }
    
            public void Test(int i) {
                if (i == 0)
                    return;
                Test(i - 1);
                Console.WriteLine(i);
            }

      这个的输出结果为:

    1
    2
    3
    

      上面这个递归输出3的时候,方法Test有4个不同的,独立的帧被压入了栈里面。因为栈是先进后出的,所以输出时,就是123的顺序输出。

  • 相关阅读:
    HotSpot VM执行引擎的实现
    解释器与JIT编译器
    执行引擎(Execution Engine)基础知识
    堆、栈、方法区的详细图解
    方法区的垃圾回收
    方法区的演进
    方法区的内部结构
    方法区内存配置
    设计模式简记-设计原则之迪米特法则
    设计模式简记-设计原则之DRY原则
  • 原文地址:https://www.cnblogs.com/socialdk/p/2908758.html
Copyright © 2011-2022 走看看