1、递归就是函数自己调用自己。老和尚的故事。
2、当递归调用层次过多的时候就会发生“StackOverflowException”异常,所以以后写程序如果遇到“StackOverflowException”异常,一般就是一个死的递归。递归都有一个递归的终止条件,就是什么时候不再递归了。
3、只要程序报错“StackOverflowException”,一般就是程序中没有“递归终止条件”。递归终止条件:也就是不再继续递归的情况。
4、用递归计算1+...+n的和。
static void Main(string[] args)
{
Output(0);
Console.ReadKey();
}
static void Output(int i)
{
Console.WriteLine(i);
if (i < 3)
{
Output(i + 1);//每调用一次相当于创建Output方法的一个实例
Console.WriteLine(i);
//每个方法内部的局部变量相当于每个方法“类实例”的私有字段
}
}
分析这段代码的执行过程如下:
2:用string.IndexOf方法输出字符串中所有的姓名“同志们好我是陆荣锦。哈哈,我是小沈阳。哇塞我是小月月。” 。
案例,显示树的所有节点:
private void ShowNodes(TreeNodeCollection treeNodes)
{
foreach (TreeNode treeNode in treeNodes)
{
txtLog.AppendText(treeNode.Text+"\n");
ShowNodes(treeNode.Nodes);//显示此节点下的子节点
}
}
写递归程序的时候不用刻意去分析执行流程,只要“想当然”就可以 盗梦空间。讲故事(讲故事(讲故事()))。
static void Main(string[] args)
{
Output(0);
}
static void Output(int i)
{
Console.WriteLine(i);
Output(i + 1);
}
static void 讲故事()
{
// 每调用一次函数,就相当于创建了函数的一个实例。
//自己调用自己,函数的每个不同的调用层次的【局部变量】都不互相干扰。
count++;
int i = count;
Console.WriteLine(i+"从前有座山,山里有个庙,。。。。天天给小和尚讲故事,讲的是神马呢");
if (count < 5)//递归的终止条件,递归一定要有终止条件
{
讲故事();
}
Console.WriteLine(count);//打印的是当前陀螺上的数字
Console.WriteLine("第"+i+"层故事讲完了");
}
//输出结果为什么是5、4、3、2、1?一旦进入下一层程序就暂停了。int i=count等于将那一刻的时间记录下来。
static void Main(string[] args)
{
// Test2();
//讲故事();
//Show();
string s ="fafasdfnumber=1,呼哈哈number=2,嘿嘿number=3,ddd";
Process(s);
Console.ReadKey();
}
static void Process(string s)
{
int index = s.IndexOf("number=");
if(index<0)//如果字符串中不包含number=则终止递归
{
return;
}
char c = s[index+"number=".Length];
Console.WriteLine(c);
string leftStr = s.Substring(index+"number=".Length+1);//取提取后剩余的部分
Process(leftStr);//继续进行递归处理
Console.WriteLine(c);
}