博文已轉移,請借一步說話→ http://www.weixuehao.com/archives/628
經常會看到一些人,問你,“來,寫一個遞歸算法吧”。遞歸算法真的那么好嗎?下面是經常看到的一些題目,還有,遞歸算法的優缺點!
常見題:
1、計算數組{1,1,2,3,5,8,13...}第30位的值

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的值

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的值
這個算法該怎么寫呢?!
歡迎回復,算法多多益善....