遞迴演算法造成的問題分析與解決

2021-09-14 02:51:35 字數 3234 閱讀 3467

原文是在我自己部落格中,小夥伴也可以點

閱讀原文進行跳轉檢視,還有好聽的背景**噢~

遞迴,在編碼中應該算是一種很常見的演算法了。之前在學習c語言的時候,也同樣了解過一些基本的演算法,比如斐波那契。在學習的時候,對演算法這種程式設計技巧就有了一種濃濃的敬畏之心,因為覺得會演算法的人就很厲害了,可以把很長的**塊通過一段簡短的演算法解決並得到想要的結果。

今天在實際工作中也遇到了演算法中一些問題。整理一下,形成今天的內容【演算法中的遞迴演算法】。

借用百科的一段話來表述就是:

乙個過程或函式在其定義或說明中有直接或間接呼叫自身的一種方法。
同樣引用百科的一句話,個人覺得非常經典:

用有限的語句來定義物件的無限集合;
這句話什麼意思呢,通俗點來理解就是,我程式只有一套,但是我可以通過遞迴(自身呼叫自身)的特性,不管你有多少個值,我都能妥妥的給你按照特定的程式邏輯處理嘍。(就是這麼強勢,嘿嘿!)

自己之前對遞迴的理解就是自己呼叫自己,通過多次的自己呼叫自身,通過同一套程式方法,來達到解決問題的目的;這種方法可以明顯的減少**量,而且靈活,尤其是在多重迴圈的時候,可以採用遞迴來替代。但是這種方法也有缺點,就是增加了程式了執行速度,而且有時候可能會因為編碼不當,造成死迴圈、棧溢位等問題。但是只要用好,解決問題還是不差的;

今天在工作中,遇到乙個把無限分類的多維陣列轉換成html樹的時候,就遇到了點小麻煩,可能是因為一時馬虎,當局者迷的緣故,自己就像掉進死迴圈裡,一直出不來,後來,也是在請教身邊的朋友後,才得到解決,下面我們來看一下出現了什麼問題(其實問題已經提在了sf社群上,問題標題是多維陣列分類樹 組合html樹的問題?(遞迴),有興趣的小夥伴可以去看下):

最初的陣列結構是乙個無限分類的多維陣列:

由上圖可以看到,這個陣列的childs下標裡面對應的就是子分類,分類可以有無限個。我們要把它組裝成下圖的理想形態:

雖然看著很簡單,但是實際上走了不少彎路,最後卡在了乙個點上,始終沒出來。我最開始的遞迴方法是:

function creathtmltree($tree)

通過測試得到了下圖的錯誤內容:

我們可以看到,它給$htmltree這個變數給了多餘的值,通過求教才明白,我的**中

static $htmltree;

$htmltree .= '";

這四行**來給$htmltree累加數值就可以了。

來看一下,最終形態的遞迴方法是什麼樣子:

// 遞迴運算建立html樹結構

function creathtmltree($tree)

這樣就可以解決了。同樣還有另外一種方式,那就是通過返回值的方式,來進行遞迴運算:

// 遞迴運算建立html樹結構

function creathtmltree($tree)

通過這種返回值累加的演算法,也同樣可以得到想要的結果。

今天為了測試和解決遞迴演算法帶來的問題,特意找了段**進行測試,也是我下午一直在實驗的demo,手癢癢的小夥伴,可以立馬copy到本地親自體驗一下:

<?php 

$data = [

['id'=>1,'parentid'=>0,'name'=>'中國'],

['id'=>2,'parentid'=>0,'name'=>'美國'],

['id'=>3,'parentid'=>0,'name'=>'南韓'],

['id'=>4,'parentid'=>1,'name'=>'北京'],

['id'=>5,'parentid'=>1,'name'=>'上海'],

['id'=>6,'parentid'=>1,'name'=>'廣西'],

['id'=>7,'parentid'=>6,'name'=>'桂林'],

['id'=>8,'parentid'=>6,'name'=>'南寧'],

['id'=>9,'parentid'=>6,'name'=>'柳州'],

['id'=>10,'parentid'=>2,'name'=>'紐約'],

['id'=>11,'parentid'=>2,'name'=>'華盛頓'],

['id'=>12,'parentid'=>3,'name'=>'首爾'],

]; /**格式化陣列輸出**/

function p($arr)

else

echo "

"; echo '********************====結束********************====';

echo "

";

}/**

* 多維陣列樹形結構

*/function tree($data, $pid = 0)

}if (empty($children))

foreach ($children as $key => $value)

}return $children;

}// 遞迴運算建立html樹結構

function creathtmltree($tree)

$tree = tree($data);

$htmltree = creathtmltree($tree);

p($tree);

p($htmltree);演算法,這門技巧,是我嚮往的高階玩意兒。覺得它挺炫的,在開頭我就有提到,可以用極短的**解決複雜的業務程式,大大減少的**量。但它同樣也像一顆**炸彈一樣,也充滿著威脅。所以,在之後的遞迴演算法中,應該小心謹慎,避免出現問題。

好了,今天就分享到這裡,以上。

在百科裡看到遞迴解釋的兩句話,也同樣經典,奉上:

遞迴需要有邊界條件、遞迴前進段和遞迴返回段

當邊界條件不滿足時,遞迴前進;當邊界條件滿足時,遞迴返回

這大概說的就是遞迴的執行條件吧。

完。

演算法 遞迴與回溯演算法解決八皇后問題

小結完整 在沒有其他演算法的加持下時,回溯演算法簡單來說,就是不斷試錯的過程。通過不斷向下乙個節點列舉尋找滿足條件的答案,當無法尋找到時,則返回至上乙個節點,然後繼續向下列舉。這句話可能看起來有點抽象,我們用乙個圖來演示一下。這是一張a村到e村的地圖。假設你從起點a出發到終點e 不是e1 在不知道路...

求子集問題演算法分析與實現(遞迴 非遞迴)

問題描述 若有數字集合,則其子集為null 現給定陣列,求其的全部子集。實現如下 非遞迴 0 0 0 0 0 1 0 1 0 0 1 1 1 0 0 1 0 1 1 1 0 1 1 1 計算子集的個數,即2的元素個數次方 一次規律 空集需要特殊輸出 class solution for int j ...

演算法 台階問題 遞迴解決

0 注意 0級台階有0種方法,如果n 1,f 0 1 1 這裡的f n 代表的是n個台階有一次1,2,n階的 跳法數。2 n 1時,只有1種跳法,f 1 1 3 n 2時,會有兩個跳得方式,一次1階或者2階,這回歸到了問題 1 f 2 f 2 1 f 2 2 4 n 3時,會有三種跳得方式,1階 2...