第五天遞迴
今天我們一起學習遞迴這個常見的命題。從這個命題中我們學習這樣一種特殊的資料結構:樹。在學習數學的時候引來了這個概念,它表示乙個可以通過自己來表示的函式。比較通俗的定義是:呼叫自身的程式。
最常見的乙個例子是階乘:
1n=0;
f(n)=
f(n-1) n>=1;
如果直接計算,可以使用乙個迴圈:
for(n=1,s=1; n<=n; n++) s*=n;
這也是按照數學定義式來計算的,但是將這兩個表達放在一起也需要人的思維整合過程。下面使用遞迴的方法可以更加直觀的表示其定義:
int fac(int n)
我們在高中、大學的數學課上都做過很多,需要找到
f(n)=q(n)*f(n-1)
這樣關係來解決的問題
(q(n)
相對比較好計算
)。而在計算機中使用遞迴可以使用更簡潔的**表達程式設計師的思想,並且良好的遞迴效率並不差(其函式呼叫底層機制是使用下堆疊來實現的)。可以看到,遞迴總是可以找到等同的非遞迴演算法。而且大部分的
for迴圈都可以轉化成乙個遞迴式。
使用遞迴需要注意的是它的遞迴深度。這可能導致我們的遞迴無法完成。
我們來看看遞迴的基本結構:
1、它需要解決乙個基本的情況:如階乘的0!
=1
2、每次遞迴都需要逼近基本的情況:n!
=(n-1)!*n
;這樣遞迴的正確性我們可以使用歸納法來證明,階乘這樣的直接用定義式來表達的就不需要證明了吧。
有乙個命題叫母牛問題:
若一頭小母牛
, 從出生第四年開始每年生一頭小母牛
,按此規律,第
n年時有多少頭母牛
這個問題可以很好的使用遞迴方法表達人的思考方式。我們在解決此問題時需要找到乙個表示母牛數量的數學等式。前面3
年中,沒有新的小牛成為媽媽。那麼
3年後,不斷有小牛變成媽媽。我們來這樣寫此表示式:
n年時牛的數量
=n-3
年時牛的數量
+n-1
年時牛的數量。
n-3年前牛的數量其實就是
n-1年時牛媽媽的數量。
並且有n=1
時,牛的數量為
count
。如此分析,它可以套用上面的公式來解決問題了。
cpp遞迴實現:
//this function is write by
zhouhuahai(大草原
)
in csdn
int getnumber(int years)
這裡還有乙個非遞迴的演算法,大家可以比較參考下。
// this function write by
pomelowu(
羽戰士)
in csdn
int getbaby (int n)
}return sum;
}
上面的兩個程式來自
csdn
的兩位朋友。這個問題在
給大家留個練習:
fibonacci
數列:1,1
,2,3
,5,8
,13 …
請給出來此數列的第
n項遞迴演算法。不寫答案了,去
上自己search
下,太多了。
第五天學python
1 切分字串 language python and j a and c and golang and scala split 切割字串 生成乙個列表 暫時理解為乙個容器 有序序列 result1 language.split and print result1 2 連線序列 生成字串 跟split...
演算法高階(第五天)
二叉樹中,乙個節點可以往上往下走,那麼節點a總能走到b,求乙個二叉樹上的最遠距離。演算法思路 利用遞迴 結果要麼是左子樹的最大距離,要麼是右子樹的最大距離,要麼是左子樹的最大深度到右子樹的最大深度 public static class returntype public static return...
學python的第五天
一 字串操作 三 1 切分字串 language python and j a and c and golang and scala split 切割字串 生成乙個列表 暫時理解為乙個容器 有序序列 result1 language.split and print result1 連線序列 生成字串...