【算法】——反應遲鈍的遞歸


 

博文已轉移,請借一步說話→ http://www.weixuehao.com/archives/628

 

經常會看到一些人,問你,“來,寫一個遞歸算法吧”。遞歸算法真的那么好嗎?下面是經常看到的一些題目,還有,遞歸算法的優缺點!
常見題:

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

 

這個算法該怎么寫呢?!

歡迎回復,算法多多益善....


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM