遞迴函式的再理解

2021-07-22 10:31:11 字數 1134 閱讀 4183

學習到遞迴函式的寫法時,總是很難深刻理解到背後的設計思想。只知道問題被分解到了,還有乙個出口,外加呼叫自身,最後就能神奇的實現功能。

後來,知道函式呼叫是一種棧式結構,每一次呼叫會把當前狀態壓棧,然後繼續往前走,直到呼叫的函式有結果了,再返回去。

看似理解了背後的邏輯,但是,對於遞迴的掌握還是僅僅侷限於斐波那契數列,階乘等這些小問題的解決上,再難一點就難以理解,更談不上隨意使用了。

我想根子還是出在原理沒有好好理解上。

直到某天,別人告訴我:

遞迴 = 遞推 + 回歸

一下子就讓我有醍醐灌頂之感,雖然這些在實際理解中已經使用了,但是沒有點到這一層的理解,總是欠缺了些什麼。

高中數學學得還不錯的同學都會直到,求數列的時候,根據遞推公式,有很多種好玩的解法。什麼錯位相除,數列差額等比替換等等。

然後我們常常知道a0,a1,根據an,an-1,an-2等之間的關係,很自然的就能把題解出來。

為什麼一到計算機裡有不太自然了呢?

就個人而言,是思考的順序問題。

在數學的解法中,我們根據遞推公式會去想推倒乙個通項公式,其實要更難一些。因為要經過一些變換得出通項是主要目標,a0,a1只不過是用於檢驗,帶入罷了。

但是在計算機中,由a0,a1可以推出a2,a3,…,an

這樣就夠了,除非再進一步優化,可以縮減問題規模,比如求出通項,在o(1)時間就能解決問題之類。

那麼,帶著從a0,a1一直解到an的順序,遞迴就很簡單了。

首先,我們找到遞推公式。e,g:

an = m*an-1 + c

我們看到問題可以往下面拆解:

an-1 = m*an-2 +c

an = m*(m*an-2+c) + c

an-2 = m*an-3 + c

an = m*(m*(an-3+c)+c) + c

…..

an = m*(m*(m*…(m*a1+c)))) +c

直到a1時,發現終於有了出口。最後那個計算m*a1+c的函式呼叫終於得出了結果可以返回,於是,再倒著回來推出a2,a3,…an

所以寫程式的時候要想明白:遞推 + 回歸。

遞迴再理解

其實關於遞迴,我也是比較模糊的,至今能理解和能用的遞迴演算法,基本是靠記憶和經驗,要是讓我自己設計乙個遞迴,估計又得難半天,很早都想總結一下,喜歡瀏覽技術網 站,總是能找到好東西,現在將遞迴演算法總結如下,也不是多麼深刻,多麼高大上,可以說還是拙見吧 定義遞迴演算法 基本思想 那麼什麼是遞迴演算法呢...

對函式的再理解

函式的定義域是針對單獨的自變數而言的 引例,已知函式 f x 2x 1 的定義域是 0,infty 則意味著只能是 x in 0,infty 引例,已知 f 2x 1 x 2 的定義域為 1,1 則意味著需要先由 f 2x 1 x 2 變換得到 f x cfrac cfrac 具體變換 令 2x 1...

遞迴函式理解

package algorithms.sort public class middlesplitbyrecursion public static void middlesplitbytworecursion int a,int lo,int hi public static void main s...