【C#算法】递归算法搜集

 1)1、1、2、3、5、8.......用递归算法求第30位数的值?

  首先我们可以发现从第3位数起后一位数等于前两位数值之和,即:x=(x-1)+(x-2),x>2;

  这里需要不断的相加,第一时刻就会想到循环处理,我们尝试用数组去装载这些数值,即:

  int[] a=new int[30];

 a[0]=1;

 a[1]=1;

 for(int i=2;i<30;i++)

{

    a[i]=a[i-1]+a[i-2];

}

求a[29]的值即为第30位数的值。

递归该如何处理呢?同样定义函数

fun(n)

{

    return fun(n-1)+fun(n-2)//n为第几位数,第n位数返回值等于第n-1位数的值与第n-2位数的值之和

}

只有当n>2为这种情况,就可以做个判断

fun(n)

{

     if(n==1 || n==2)

          return 1;

     else

          return fun(n-1)+fun(n-2);

}

求fun(30);

网站看到别人的分析也不错:

【问题】 编写计算斐波那契(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+2+3+4+5+....+n的值

Fun(n)=n+Fun(n-1)

n=1时为1

Fun(n)

{

     if(n==1)

       return 1;

     else

      return n+Fun(n-1);

}

--------------------------------------------------------------------------------

表结构如下所示:
Num                   Name                                 fatherNum       BZ
01                      总节点                                      0              ......
0101                   第一个一级节点                          01             ......
010101               第一个一级节点的第一个支节点       0101         ......
010102               第一个一级节点的第二个支节点       0101         ......
010103               第一个一级节点的第三个支节点       0101         ......
0102                   第二个一级节点                          01             ......
010201               第二个一级节点的第一个支节点       0102         ......
0103                   第三个一级节点                          01             ......
010301               第三个一级节点的第一个支节点       0103         ......
01030101           第三个一级节点的第一个支节点       010301      ......

使用递归方法 把数据表加载到treeview后,
怎样根据treeview上的某个节点知道它在数据库表上对应的主键值?
这是递归方法

C/S:


 1        public void AddTree(string fatherNum, TreeNode pNode)
 2         {
 3 
 4             DataView dvTree = new DataView(ds.Tables[0]);
 5 
 6             dvTree.RowFilter = "[father Num] = " + fatherNum;
 7             foreach (DataRowView Row in dvTree)
 8             {
 9                 TreeNode Node = new TreeNode();
10                 if (pNode == null)
11                 {         //添加根节点   
12                     Node.Text = Row["Name"].ToString();
13 
14                     treeView1.Nodes.Add(Node);
15                     AddTree(Row["Num"].ToString(), Node);         //再次递归   
16                 }
17                 else
18                 {       //添加当前节点的子节点   
19                     Node.Text = Row["Name"].ToString();
20                     pNode.Nodes.Add(Node);
21 
22                     AddTree(Row["Num"].ToString(), Node);           //再次递归   
23                 }
24             }
25         }
26 
27         DataSet ds = new DataSet();
28         private void Form2_Load(object sender, EventArgs e)
29         {
30             SqlConnection conn = new SqlConnection("server=.;database=test;uid=sa;pwd=;");
31             SqlDataAdapter da = new SqlDataAdapter("select * from test",conn);
32             da.Fill(ds);
33             TreeNode pNode=null;
34             AddTree("0", pNode);
35         }
36 

B/S:

 1  DataSet ds = new DataSet();
 2    protected void Page_Load(object sender, EventArgs e)
 3    {
 4        if (!IsPostBack)
 5        {
 6            SqlConnection conn = new SqlConnection("server=.;database=test;uid=sa;pwd=;");
 7            SqlDataAdapter da = new SqlDataAdapter("select * from test", conn);
 8            da.Fill(ds);
 9
10            TreeNode pNode = null;
11            AddTree("0", pNode);
12        }

13
14    }

15    public void AddTree(string fatherNum, TreeNode pNode)
16    {
17        DataRow[] dr = ds.Tables[0].Select("fatherNum=" + fatherNum);
18        if (dr.Length > 0)
19        {
20            foreach (DataRow d in dr)
21            {
22                TreeNode tNode = new TreeNode();
23                tNode.Text = d["Name"].ToString();
24                if (pNode == null)
25                {
26                          //添加根节点  
27                    TreeView1.Nodes.Add(tNode);
28                }

29                else
30                {
31                        //添加当前节点的子节点  
32                    pNode.ChildNodes.Add(tNode);
33                    tNode.Collapse();
34                }

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

37        }

38     }

 

原文地址:https://www.cnblogs.com/cuishao1985/p/1513481.html