首页 新闻 会员 周边

C#关于递归的好文章?

1
[已解决问题] 解决于 2012-08-14 13:20

求一个C#关于递归的好文章...............................

C#
微澜的主页 微澜 | 初学一级 | 园豆:-1
提问于:2012-06-06 22:19
< >
分享
最佳答案
2

首先碰到的是这样的一首题目:计算数组{1,1,2,3,5,8.......} 第30位值,不用递归,我写出了以下这样的代码:

        static void Main(string[] args)

        {

            int[] num=new int[30];

            num[0]=1;

            num[1]=1;

            int first=num[0];

            int second=num[1];

            for (int i = 2; i < num.Length; i++)

            {

                num[i] = first + second;

                first = second;

                second = num[i];

            }

            Console.WriteLine(num[29]);

            Console.ReadLine();

        }

写出来,十分的累赘,于是改为归递算法来写,一目了然,十分明了。以下是代码:

static void Main(string[] args)

 {

            Console.WriteLine(Process1(30));

            Console.ReadLine();       

 }

 public static int Process1(int i)

 {

            //计算数组{1,1,2,3,5,8.......} 第30位值

            if (i == 0) return 0;

            if (i == 1) return 1;

            else

                return Process1(i - 1) + Process1(i - 2);

 }

 

做了一些练习:

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.用递归法将一个整数n转换成字符串,例如,输入483,就输出字符串"483".n的位数不确定,可以是任意位数的整数。 

static void Main(string[] args)

       {

            IntToString(483, "");

            Console.ReadLine();

        }

        public static void IntToString(int input,String output)

        {

         //用递归法将一个整数n转换成字符串,例如,输入483,就输出字符串"483".n的位数不确定,可以是任意位数的整数。

         //   String output = "";

            output = input % 10+output;

            if (input / 10 != 0)

            {

                IntToString(input / 10,output);

            }

            else Console.WriteLine(output);

        }

 

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

C#递归的应用是可以让繁琐的问题的变得简单可执行,那么具体的实例就是打开文件的操作,我们知道获得某一目录下第一级的所有文件和文件夹列表,很容易办到:

DirectoryInfo di=new DirectoryInfo(strBaseDir);//strBaseDir是起始目录,绝对地址   DirectoryInfo[] diA=di.GetDirectories();//获得了所有一级子目录   FileInfo[] fiA=di.GetFiles();//获得了所有起始目录下的文件 

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

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#递归的方法  

         }  

最后,如何把所有目录信息从ArrayList中取出来呢?如下:

for(int i=0;i<al.Count;i++) 

 {  

        //textBox1是容器,拷贝我的代码,注意要换一个你自己的容器  

         textBox1.AppendText(al[i].ToString()+" ");  

}

==============================================================================

bsCS方法用C#递归方法把数据表加载到treeview控件中

 

先看一下数据库的结构:

表结构如下所示:

Num                    Name                                                        fatherNum       BZ

01                       总节点                                                         0                       ......

0101                   第一个一级节点                                      01                    ......

010101               第一个一级节点的第一个支节点       0101               ......

010102               第一个一级节点的第二个支节点       0101               ......

010103               第一个一级节点的第三个支节点       0101               ......

0102                   第二个一级节点                                      01                    ......

010201               第二个一级节点的第一个支节点       0102               ......

0103                   第三个一级节点                                      01                    ......

010301               第三个一级节点的第一个支节点       0103              ......

01030101           第三个一级节点的第一个支节点       010301         ......

 

C/S代码如下:

           public void AddTree(string fatherNum, TreeNode pNode)

         {

              DataView dvTree = new DataView(ds.Tables[0]);

 

              dvTree.RowFilter = "[father Num] = " + fatherNum;

              foreach (DataRowView Row in dvTree)

              {

                  TreeNode Node = new TreeNode();

                  if (pNode == null)

                  {         //添加根节点  

                      Node.Text = Row["Name"].ToString();

 

                      treeView1.Nodes.Add(Node);

                      AddTree(Row["Num"].ToString(), Node);         //再次递归  

                  }

                  else

                  {       //添加当前节点的子节点   

                     Node.Text = Row["Name"].ToString();

                      pNode.Nodes.Add(Node); 

                      AddTree(Row["Num"].ToString(), Node);           //再次递归  

                  }

              }

         }

 

          DataSet ds = new DataSet();

          private void Form2_Load(object sender, EventArgs e)

         {

              SqlConnection conn = new SqlConnection("server=.;database=test;uid=sa;pwd=;");

              SqlDataAdapter da = new SqlDataAdapter("select * from test",conn);

              da.Fill(ds);

              TreeNode pNode=null;

              AddTree("0", pNode);

         }

 

下面是B/S结构的代码:

     DataSet ds = new DataSet();

     protected void Page_Load(object sender, EventArgs e)

     {

         if (!IsPostBack)

         {

             SqlConnection conn = new SqlConnection("server=.;database=test;uid=sa;pwd=;");

             SqlDataAdapter da = new SqlDataAdapter("select * from test", conn);

             da.Fill(ds);

 

             TreeNode pNode = null;

             AddTree("0", pNode);

         }

 

     }

     public void AddTree(string fatherNum, TreeNode pNode)

     {

         DataRow[] dr = ds.Tables[0].Select("fatherNum=" + fatherNum);

         if (dr.Length > 0)

         {

             foreach (DataRow d in dr)

             {

                 TreeNode tNode = new TreeNode();

                 tNode.Text = d["Name"].ToString();

                 if (pNode == null)

                 {

                           //添加根节点 

                     TreeView1.Nodes.Add(tNode);

                 }

                 else

                 {

                         //添加当前节点的子节点 

                     pNode.ChildNodes.Add(tNode);

                     tNode.Collapse();

                 }

                 AddTree(d["Num"].ToString(), tNode);       //递归

             }

         }

     }

 

=================================================================================

    SQL的递归查询

create procedure GetData(@a nvarchar(50))

as

begin

 create table #Temp(

  a nvarchar(50),

  b nvarchar(50),

  c nvarchar(50)

 )

 declare @tempB nvarchar(50)

 insert into #Temp select a,b,c from T where a in(@a)

 declare cur cursor for select b from #Temp

 open cur

 fetch next from cur into @tempB

 while @@fetch_status = 0

 begin

  insert into #Temp select a,b,c from T where a in(@tempB)

  fetch next from cur into @tempB

 end

 close cur

 deallocate cur

 select * from #Temp

end

 

=====================================================

上面的是假设表结构如下的:

a        b        c

=========================

1 2   aa

1 3   dfd

2 4   fdas

3 5   fds

4 7   fds

奖励园豆:5
程序诗人 | 菜鸟二级 |园豆:313 | 2012-06-07 12:47
其他回答(6)
0

怎么又是你啊。

悟行 | 园豆:12559 (专家六级) | 2012-06-06 22:57

经常有不会的问题啊

支持(0) 反对(0) 微澜 | 园豆:-1 (初学一级) | 2012-06-06 23:11
0

递归还有什么要介绍的,就是只要满足两个条件就行

1,在函数中调用函数本身;

2,有一个可以退出循环的条件。

满足了这两个就是递归了,实际应用中也即是遵循着两点来的。

psforever | 园豆:461 (菜鸟二级) | 2012-06-06 23:25
0
无之无 | 园豆:5095 (大侠五级) | 2012-06-07 08:17
0

递归就是递归,c#就是C#。这两者有毛关系

嗷嗷 | 园豆:757 (小虾三级) | 2012-06-07 09:42
0
dudu | 园豆:31007 (高人七级) | 2012-06-07 10:29
0

我觉得我写的还行,虽然不是C#的,像嗷嗷说递归不属于C# :)

http://www.cnblogs.com/jerry-chou/archive/2012/03/13/2394198.html

Jerry Chou | 园豆:2642 (老鸟四级) | 2012-06-07 11:51
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册