首頁 後端開發 php教程 php 遞歸函數的三種實作方式

php 遞歸函數的三種實作方式

Aug 08, 2016 am 09:18 AM
echo nbsp static test

   遞歸函數是我們常用到的一類函數,最基本的特點是函數自身呼叫自身,但必須在呼叫自身前有條件判斷,否則無限無限調用下去。實作遞歸函數可以採取什麼方式呢?本文列出了三種基本方式。理解其原來需要一定的基礎知識水品,包括對全域變量,引用,靜態變量的理解,也需對他們的作用範圍有所理解。遞歸函數也是解決無限級分類的一個很好地技巧。如果對無限級分類感興趣,請參考php利用遞歸函數實現無限級分類。我習慣套用通俗的話解釋複雜的道理,您確實不明白請參考手冊。

  利用引用做參數

  先不管引用做不做參數,必須先明白引用到底是什麼?引用不過是指兩個不同名的變數指向同一塊儲存位址。本來每個變數有各自的儲存位址,賦值刪除各行其道。現在可好,兩個變數共用一塊儲存位址。 $a=&$b; 。其實指的是 $a 不管不顧自己原來的儲存位址,非要和 $b 共用一室了。因而任何對儲存位址數值的改變都會影響兩個值。  

  函數之間本來也是各行其是,即便是同名函數。遞歸函數是考慮將引用作為參數,成為一個橋樑,形成兩個函數間的資料共享。雖然兩個函數見貌似操作的是不同地址,但是實際上操作的是一塊兒內存地址。

<span>function</span> test(<span>$a</span>=0,&<span>$result</span>=<span>array</span><span>()){
</span><span>$a</span>++<span>;
</span><span>if</span> (<span>$a</span><10<span>) {
    </span><span>$result</span>[]=<span>$a</span><span>;
    test(</span><span>$a</span>,<span>$result</span><span>);
}<br>echo $a;
</span><span>return</span><span>$result</span><span>;

}</span>
登入後複製

  上面的例子非常簡答,以$aArray ( [0] => 1 [1] => 2 [2] => 3 [3] => 4 [4] => 5 [5] => 6 [6] => 7 [7] => 8 [8] => 9 ) 。

本例比較有趣的是echo $a 的值。相信很多人認為是12345678910吧,其實不然,是1098765432。為什麼呢?因為函數還沒執行echo $a前就進行了下一次的函數遞迴。真正執行echo $a是當$a

  利用全域變數

  利用全域變數完成遞迴函數,請確保你確實理解什麼是全域變數。 global在函數內申明變數不過是外部變數的同名引用。變數的作用範圍仍在本函數範圍內。改變這些變數的值,外部同名變數的值自然也改變了。但一旦用了&,同名變數就不再是同名引用。利用全域變數實作遞歸函數沒必要理解到這麼深的一層,還保持原有對全域變數的看法就可以順理成章理解遞歸函數。

<span>function</span> test(<span>$a</span>=0,<span>$result</span>=<span>array</span><span>()){
    </span><span>global</span><span>$result</span><span>;
    </span><span>$a</span>++<span>;
    </span><span>if</span> (<span>$a</span><10<span>) {
        </span><span>$result</span>[]=<span>$a</span><span>;
        test(</span><span>$a,$result</span><span>);
    }
    </span><span>return</span><span>$result</span><span>;
}</span>
登入後複製

利用靜態變數

我們常常在類別中見到static,今天我們把它利用到遞歸函數中。請記住static的作用:僅在第一次呼叫函數的時候對變數進行初始化,並且保留變數值。

  舉個栗子:

<span>function</span><span> test(){
</span><span>static</span><span>$count</span>=0<span>;
</span><span>echo</span><span>$count</span><span>;

</span><span>$count</span>++<span>;
}
test();
test();
test();
test();
test();</span>
登入後複製

  請問這段程式碼的執行結果是多少?是00000麼?必然不是。是01234。首先第一次呼叫test(),static對 $count 初始化,其後每一次執行完都會保留 $count 的值,不再初始化,相當於直接忽略了$count=0; 這一句。   因而將static應用到遞歸函數作用可想而知。在將需要作為遞歸函數間作為「橋樑"的變數利用static進行初始化,每一次遞歸都會保留"橋樑變數"的值。

<span>function</span> test(<span>$a</span>=0<span>){
    </span><span>static</span><span>$result</span>=<span>array</span><span>();
    </span><span>$a</span>++<span>;
    </span><span>if</span> (<span>$a</span><10<span>) {
        </span><span>$result</span>[]=<span>$a</span><span>;
        test(</span><span>$a</span><span>);
    }
    </span><span>return</span><span>$result</span><span>;
}</span>
登入後複製

總結

  所謂遞歸函數,重點是如何處理函數調用自身是如何保證所需要的結果得以在函數間合理"傳遞",當然也有不需要函數之間傳歸函數,例如:

<span>function</span> test(<span>$a</span>=0<span>){
    </span><span>$a</span>++<span>;
    </span><span>if</span> (<span>$a</span><10<span>) {
        </span><span>echo</span><span>$a</span><span>;

        test(</span><span>$a</span><span>);
    }
}</span>
登入後複製

  面對這樣的函數,我們就不必大傷腦筋了。順便說一句,深入理解變數引用相關知識對解決這類問題大有裨益。

以上就介紹了php 遞歸函數的三種實作方式,包括了面向的內容,希望對PHP教學有興趣的朋友有幫助。

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

AI Hentai Generator

AI Hentai Generator

免費產生 AI 無盡。

熱門文章

R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
1 個月前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳圖形設置
1 個月前 By 尊渡假赌尊渡假赌尊渡假赌
威爾R.E.P.O.有交叉遊戲嗎?
1 個月前 By 尊渡假赌尊渡假赌尊渡假赌

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

華為Watch GT 5智慧手錶獲得新功能更新 華為Watch GT 5智慧手錶獲得新功能更新 Oct 03, 2024 am 06:25 AM

華為正在全球推出Watch GT 5和Watch GT 5 Pro智慧手錶的軟體版本5.0.0.100(C00M01)。這兩款智慧手錶最近在歐洲推出,標準型號是該公司最便宜的型號。這和諧

鐵拳桑德斯上校的夢想被肯德基炸了 鐵拳桑德斯上校的夢想被肯德基炸了 Oct 02, 2024 am 06:07 AM

《鐵拳》系列總監原田勝宏曾認真嘗試將桑德斯上校帶入這款標誌性格鬥遊戲中。在接受 TheGamer 採訪時,原田透露,他向日本肯德基提出了這個想法,希望將這位快餐傳奇人物納入其中。

第一眼:即將推出的 Anker Zolo 4 連接埠 140W 帶顯示壁式充電器的拆箱視訊洩露 第一眼:即將推出的 Anker Zolo 4 連接埠 140W 帶顯示壁式充電器的拆箱視訊洩露 Oct 01, 2024 am 06:32 AM

2024 年 9 月早些時候,Anker 的 Zolo 140W 充電器被洩露,這是該公司首款帶有顯示器的壁式充電器,這引起了轟動。現在,小李TV在YouTube上發布的新開箱影片讓我們親眼目睹了這款hi

Cyber​​truck FSD 評論稱讚快速車道切換和全螢幕視覺化 Cyber​​truck FSD 評論稱讚快速車道切換和全螢幕視覺化 Oct 01, 2024 am 06:16 AM

特斯拉正在推出最新的全自動駕駛(監督)版本12.5.5,並最終帶來了承諾的Cyber​​truck FSD 選項,距離皮卡上市十個月後,該功能包含在基礎系列的裝飾價格中。 F

搭載 HyperOS 的新款小米米家石墨烯油汀到貨 搭載 HyperOS 的新款小米米家石墨烯油汀到貨 Oct 02, 2024 pm 09:02 PM

小米即將在中國推出米家石墨烯油汀暖爐。該公司最近在其優品平台上成功舉辦了一次智慧家居產品眾籌活動。根據頁面顯示,該設備已開始出貨至

Garmin 透過新的更新發布了針對多款智慧手錶的冒險賽車活動改進 Garmin 透過新的更新發布了針對多款智慧手錶的冒險賽車活動改進 Oct 01, 2024 am 06:40 AM

Garmin 將於本月底為其最新的高階智慧手錶提供一組新的穩定更新。回顧一下,該公司發布了系統軟體 11.64,以解決 Enduro 3、Fenix E 和 Fenix 8 的高電池消耗問題(亞馬遜售價 1,099.99 美元)。

三星 Galaxy Z Fold 特別版透露將於 10 月底登陸,但名稱出現衝突 三星 Galaxy Z Fold 特別版透露將於 10 月底登陸,但名稱出現衝突 Oct 01, 2024 am 06:21 AM

三星期待已久的「特別版」可折疊手機的推出又迎來了另一個轉折。最近幾週,有關所謂 Galaxy Z Fold 特別版的傳言相當安靜。相反,焦點已轉移到 Galaxy S25 系列,包括

Manjaro 24.1「Xahea」與 KDE Plasma 6.1.5、VirtualBox 7.1 等一起發布 Manjaro 24.1「Xahea」與 KDE Plasma 6.1.5、VirtualBox 7.1 等一起發布 Oct 02, 2024 am 06:06 AM

Manjaro 已有十多年的歷史,被認為是最用戶友好的 Linux 發行版之一,適合初學者和高級用戶,易於安裝和使用。這個基於 Arch 的發行版主要在奧地利、德國和法國開發

See all articles