经常会看到一些人,问你,“来,写一个递归算法吧”。递归算法真的那么好吗?下面是经常看到的一些题目,还有,递归算法的优缺点!
常见题:
1、计算数组{1,1,2,3,5,8,13...}第30位的值
Process1
Static void Main(string[] args) { Console.WriteLine(Process1(30)); Console.ReadKey(); } Public Static int Process1(int i) { if(i==0) return 0; if(i==1) return 1; else return Process1(i-1)+Process1(i-2); }
从此递归我们可以看出,递归就是从后面往前推获得数据,然后进行运算
但是如果第一题中的30改为40或者更大的数字,你有没有试过呢?
下面我们用Stopwatch来检测一下运行时间
递归-时间检测
static void Main(string[] args) { Stopwatch watch = new Stopwatch(); watch.Start(); Console.WriteLine(Process1(40)); Console.WriteLine(watch.Elapsed); watch.Stop(); Console.Read(); } public static int Process1(int i) { if (i == 1) return 1; else if (i == 2) return 1; else { return Process1(i - 1) + Process1(i - 2); } }
我们运行程序,卡一会,然后输出结果为:
运行了5秒,这才是当i=40的时候,那如果设置i为50,或更大,那要等的时候就更长了。
递归优点,简单明了,容易理解;缺点,就是效率低。
下面我们来优化一下,用如下的代码:
优化方法-时间监测
static void Main(string[] args) { Stopwatch watch = new Stopwatch(); watch.Start(); int[] num = new int[40]; 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[39]); watch.Stop(); Console.WriteLine(watch.Elapsed); Console.ReadKey(); }
然后我们来看一些运行结果如何:
运行的时间,瞬间缩短了。。。。。。。。。
这种方法,将数据从前往后推,得出最终结果。
看来我们以后还要慎用递归算法。
2、计算1+2+3+4+...+100的值
Process2
static void Main(string[] args) { Console.WriteLine(Process2(100)); Console.ReadKey(); } Public Static int Process2(int i) { if(i==0) return0; else return Process2(i-1)+i; }
3、计算1-2+3-4+5-6+7...+49-50的值
这个算法该怎么写呢?!
欢迎回复,算法多多益善....