遞迴演算法 一些個人理解

2021-08-03 23:55:00 字數 876 閱讀 1317

遞迴演算法,從定義上來說,是一種直接或者間接地呼叫自身的一種演算法,這裡的自己可以是函式或者方法。遞迴演算法的思想或者說實質就是把實際的問題分解成規模較小的乙個個的子問題,然後不斷使用遞迴呼叫方法來求得問題的解。要學習和使用遞迴演算法,就要從最基本的定義上來先解讀。

【遞迴演算法是把問題轉化為規模縮小了的同類問題的子問題,然後遞迴呼叫函式(或過程)來表示問題的解。】

從遞迴的定義上來看,我們對於那些可以使用遞迴思想來簡化並解決的問題,就相當於是在剝洋蔥,將乙個大的問題(洋蔥)簡化成乙個乙個與原問題相似但是規模更小的子問題(一片洋蔥),然後遞迴呼叫方法(剝),這樣最後得到答案,這樣我感覺形容起來就很簡單明瞭了,遞迴就是在程式執行過程中,在達到自己需要的結果之前不斷地自己呼叫自己,重複重複重複......因此,就可以看出了遞迴的特點,可以分為以下四點:

1)遞迴是方法裡呼叫自身;

2)使用遞迴策略時需要設定乙個明確的約束條件,即遞迴出口;

3)由於遞迴演算法是將乙個大的問題簡化成型別相似規模較小的子問題,因此在使用遞迴演算法解決問題時coding會顯得很簡潔,但是從第二點特點就可以知道,這是乙個在達到明確的結束條件之前,遞迴是一直進行的,執行效率較低;

4)接第三點,同理遞迴在不斷的進行的過程中,每進行一次呼叫,系統就會為每一層額返回點和區域性變數開闢棧來儲存,隨著遞迴的次數的增加,很容易造成棧溢位。

從以上的四點來看,遞迴也並不是乙個十分完美的解決方法,使用遞迴的思想來解決複雜問題的時候能提供乙個很清晰可的思路,而且可以提高程式設計效率縮短程式**,只是相對於那種巨型的問題,使用遞迴就像是掉進了乙個無底洞一樣,只是簡化了**,但是並沒有提高程式的執行效率。而且從遞迴的定義上來看,直接遞迴函式是不斷地呼叫自己,而間接的遞迴則是會呼叫兩個或更多的函式,這樣對記憶體的占用是非常大的,因此在使用遞迴的時候還是盡量要少使用區域性變數,減小記憶體壓力。

關於KMP演算法的一些個人理解

kmp演算法其實理解起來也不難,只不過很多過於公式化的講解以及太過晦澀的說法會讓人一頭霧水 kmp演算法主要是判斷乙個字串是否是另乙個字串的字串 對於這兩個字串,在演算法描述中有固定的稱謂 我們把最長的字串稱為text,需要判定的子串稱為模式pattern 對於這個問題,其實最容易想到的就是暴力列舉...

關於KMP演算法的一些個人理解

kmp演算法其實理解起來也不難,只不過很多過於公式化的講解以及太過晦澀的說法會讓人一頭霧水 kmp演算法主要是判斷乙個字串是否是另乙個字串的字串 對於這兩個字串,在演算法描述中有固定的稱謂 我們把最長的字串稱為text,需要判定的子串稱為模式pattern 對於這個問題,其實最容易想到的就是暴力列舉...

馬拉車演算法的一些個人理解

在一串字串裡找出最長字串的問題,可以通過暴力求解法來解決,其時間複雜度為o n 2 這當然不會很快。演算法的設計,就是為了讓計算機能夠更加高效地處理問題。我們希望可以降低時間複雜度,在1975一位名叫manacher的人提出了這種演算法,雖然犧牲了空間複雜度,讓時間複雜度降為o n 馬拉車演算法首先...