和arden一起學演算法 第五天

2021-03-31 12:40:14 字數 1754 閱讀 1697

第五天遞迴

今天我們一起學習遞迴這個常見的命題。從這個命題中我們學習這樣一種特殊的資料結構:樹。在學習數學的時候引來了這個概念,它表示乙個可以通過自己來表示的函式。比較通俗的定義是:呼叫自身的程式。

最常見的乙個例子是階乘:

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項遞迴演算法。不寫答案了,去

google

上自己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 連線序列 生成字串...