当前位置:编程学习 > C#> 正文

C#递归的应用

时间:2013-12-2类别:编程学习

C#递归的应用

C#递归的应用

递归的特点:


1. 递归方法一直会调用自己直到某些条件被满足
2. 递归方法会有一些参数,而它会把一些新的参数值传递给自己。

 

下面介绍一些例子介绍递归的用法

 

1. 阶乘


阶乘(!)是小于某个数的所有正整数的乘积。
0! = 1
1! = 1
2! = 2 * 1! = 2
3! = 3 * 2! = 6
...
n! = n * (n - 1)!

递归算法

  •  
  • C# 代码   复制
  • 
    public long Factorial(int n) 
    { 
    if (n == 0)//限制条件,对该方法调用自己做了限制 
    return 1; 
    return n * Factorial(n - 1); 
    } 
    		
  •  

    2. Fibonacci数列


    Fibonacci数列是按以下顺序排列的数字:
    0,1,1,2,3,5,8,13,21,34,55,…如果F0 = 0 并且 F1= 1 那么Fn = Fn-1 + Fn-2

     

    递归算法

  •  
  • C# 代码   复制
  • 
    public long Fib(int n) 
    { 
    if (n == 0 || n == 1) //满足条件 
    return n; 
    return Fib(k - 2) + Fib(k - 1); 
    } 
    
    		
  •  

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

  •  
  • C# 代码   复制
  •         
            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;
    
            }
    		
  •  

    4、汉诺塔问题

  •  
  • C# 代码   复制
  •         
            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);
            }
    		
  •  

    5、查找文件

    要是想获得某一目录下的所有文件和目录(包含所有子目录),那该怎么办呢?目录都是一层套一层的,我们不能预知某个目录的深度,只有获得了父节点,才有可能了解子节点,解决这个问题,只有递归这个概念了。

    C#递归实现代码

  •  
  • C# 代码   复制
  •    
    public ArrayList al=new ArrayList();   //我把ArrayList当成动态数组用,非常好用
    public void GetAllDirList(string strBaseDir)
    {
       DirectoryInfo di=new DirectoryInfo(strBaseDir);
       DirectoryInfo[] diA=di.GetDirectories();
       for(int i=0;i<diA.Length;i++)
       {
        al.Add(diA[i].FullName);   //diA[i].FullName是某个子目录的绝对地址,把它记录在ArrayList中
        GetAllDirList(diA[i].FullName);   //注意:这里使用C#递归的方法   
       }
    }  
    		
  •  

    总结


    1、可以用递推算法来替代递归,且性能会更好些,但我们可能需要更多的时间开销和非递归函数。但关键是我们必须根据场景选择最佳实现方式。

    2、如果性能是非常重要的,请避免使用递归

    3、如果递推方式不是很复杂的,请避免使用递归
     

    当然,我并不是要贬低递归的价值,例如人工智能中的重要一章有个极小化极大算法(Minimax algorithm),全部是用递归实现的。

    标签:
    上一篇下一篇

    猜您喜欢

    热门推荐