示例:
计算数组{1,1,2,3,5,8……} 第30位值
1)不用递归
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();
}
2)改为归递算法
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;
}
else 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 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 }
39
===========================================================================================
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