
遞歸4-遞歸360問答的弱點
之所以沒有把這段歸為算法的討論,因為這里討論的不在是算法,而只是討論一下濫用遞歸的不好的一面 。
遞歸的用法似乎是很容易的,但是遞歸還是有她的致命弱點,那就是如果運用不恰當,濫用遞歸,程序的運行效率會非常的低,低到什么程度侵協主就東散今,低到出乎你的想像!當然聲區錯未樂,平時的小程序是看不出許否呀什么的,但是一旦在大項目里濫用遞歸,效率問易創題將引起程序的實用性的大大降低!
例子:求1到200的自握率耐食投紀舉再戰降學然數的和 。
第一種做法:
#include<s述開設說較今既憲批tdio.h>
voidm侵哥快桿ain()
{
inti;
intsum=0;
for(i=1;i<=200;i++)
{
sum+=i;
}
printf("%d\n",sum);
}
該代碼中使用變量2個,計算200次 。再看下個代碼:
#include<stdio.h>
int耐游add(inti)
{
if(i==1)
{
returni;
}
else
{
ret掉布宜過民振號政urni+add(i-1);
}
}
voidmain()
{
inti;
intsu放固陳車楊資m=0;
sum=add(200);
print映海兵美問綠伯她吸f("%d\n",sum);
}
但看add()函數,每次調用要聲明一個變量,每次調用要計算一次謂清占向根曲會拉停控談,所以應該是200個變量,200次計算,對比一下想想,如果程序要求遞歸次數非常多殺讓體評打省推拿材的時候,而且類似與這種情況,我們還能用遞歸去做嗎強北藥分礦動袁?這個時候寧愿麻煩點去考慮其他辦法,也要嘗試擺脫遞歸的干擾 。
21:21|添加評論|固定鏈接|引用通告(0)|記錄它|計算機與Internet
程序算法5-遞歸3-遞讓歸的再次挖掘
遞歸的魅力就在于遞歸的代碼,寫出來實在是太簡練了,而且能解決很多看起來似乎有規律但是又不是一下子能表達清楚的一些問題 。思路清晰了,遞歸一寫出來年認短教又承安深問題立即就解決了,給人一重感覺期,遞歸這么好用 。我們在此再境方晶更深的挖掘一下遞歸的用法 。
之前再強調一點,也許有人會問,你前邊的例子用遞歸似乎是更麻煩了 。是,是麻煩了,因為為了方便理解,只能舉一些容易理解的例子,一般等實際應用遞歸的時候,遠遠不是這種狀態 。
好了我們現在看一個數字的序列;有一組數的集合{1,2,4,7,11,16,22,29,37,46,56……}我故意多給幾項,一般是只給前4項讓你找規律的 。序列給了,要求是求前50項的和 。規律?有?還是沒有?一看就象有,但是又看不出來,我多給了幾項,應該很快看出來了,哦,原來每相鄰的兩項的差是個自然數排列,2-1=1,4-2=2,7-4=3,11-7=4,16-11=5……
好了,把規律找出來了,一開始可能覺得沒頭緒,沒問題,咱們把這個序列存放到一個數組總可以吧!那我們就聲明一個數組,存放前50個數據,一個一個相加總可以了 。于是有了下邊的寫法:
#include<stdio.h>
voidmain()
{
inti,a[50],sum=0;
a[0]=1;
for(i=1;i<50;i++)
{
a[i]=a[i-1]+i;
}
for(i=0;i<50;i++)
{
sum+=a[i];
}
printf("%d\n",sum);
}
好了,代碼運行一下,結果出來了,正確不正確呢?自己測試吧,把50項改成1、2、3、4、5……項,試試前多少項是不是正確,雖然這不是正確的測試方法,但是的確是常用的測試方法 。
等到這個代碼已經完全理解了,完全明白了正個計算過程,我們就應該對這段代碼進行改寫優化了,畢竟這個代碼還是不值得用一個數組的,那么我們嘗試著只用變量去做一下:
猜你喜歡
- 日本所處的半球位置,緯度位置和海陸位置有何特點
- 小滿養生有何誤區
- 什么是相對靜止?承認相對靜止來自有何意義
- 向量的計算法則
- 山藥蛋派、荷花淀派、茶子花派各有何主要特點?
- SMC材料有何優點?
- 柯爾鴨是什么品種 與其它鴨子有何區別
- 共進晚餐是什么意思 共進晚餐有何意思
- 關于曾經擁有的句子
- 什么是經絡學?包括哪些內容?在中醫養生學有何作用?
