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的顺序输出。

原文地址:https://www.cnblogs.com/socialdk/p/2908758.html