遞歸是一個非常重要的概念,在計算機中用來表示無窮事物的一個重要手段,遞歸是一種表達相似性對象及動作的無限性構造的方法。
再說遞歸之前我們先要了解迭代。
迭代:迭代是重復反饋過程的活動,其目的通常是為了逼近所需目標或結果。每一次對過程的重復稱為一次“迭代”,而每一次迭代得到的結果會作為下一次迭代的初始值,因此迭代是從前往后計算的。
遞歸:則是一步一步往前遞推,直到遞歸基礎,尋找一條路徑, 然后再由前向后計算。
簡單來說:迭代是從前往后計算的,而遞歸則是先從后往前推,然后再由前往后計算。
舉個例子:
計算n的階乘。
這里舉例計算5!
迭代:
第一步: 1!=1
第二步:2!=2*1!=2
第三步:3!=3*2!=6
第四步:4!=4*3!=24
第五步:5!=5*4!=120
遞歸:
第一步:5!=5*4!轉而計算4!
第二步:4!=4*3!轉而計算3!
第三步:3!=3*2!轉而計算2!
第四步:2!=2*1!轉而計算1!
第五步:1!=1 遞歸出口
然后再反向計算出結果。
可能大家會好奇,計算機要如何才能實現遞歸過程呢?
計算機系統里有系統棧,通過壓棧彈棧來完成這一過程,這里就不多說了。
下面兩張圖大致反映了這一過程。
壓棧與彈棧(這里計算的是4!)。
遞歸代碼的執行是按照順序來的,因為指令的執行就是按照順序來的,這一點沒啥疑問,但是遞歸代碼中返回值的傳遞卻是反過來的,這是通過系統棧這個結構來實現的。
總結:遞歸是一個非常重要的思想,大家一定要好好理解這種思想。