首頁 後端開發 php教程 三種php遞歸函數的實作方法及實作數字的累加

三種php遞歸函數的實作方法及實作數字的累加

Jun 11, 2018 am 10:48 AM
遞迴函數

實作遞歸函數有哪些方法呢?如何用遞歸函數實現數字累加?這篇文章就主要介紹php遞歸函數三種實作方法及如何實現數字累加,需要的朋友可以參考下。

      遞迴函數在程式設計上是較常用的一類函數,其特性是函數本身可以呼叫自身,但是必須在呼叫自身前有條件判斷,否則會導致無限呼叫下去。本文列出了三種遞歸函數實作方法,第一種利用引用做參數,第二種利用全域變量,第三種利用靜態變量,理解此類問題需要有點基礎,包括對全域變量,引用,靜態變量的理解,也需對他們的作用範圍有所理解。在這不廢話了,具體介紹請看下文。

第一種方法:利用引用做參數

  先不管引用做不做參數,必須先明白引用到底是什麼?引用不過是指兩個不同名的變數指向同一塊儲存位址。本來每個變數有各自的儲存位址,賦值刪除各行其道。

現在可好,兩個變數共用一塊儲存位址。 $a=&$b; 。實際上指的是 $a 不管不顧自己原來的儲存位址,非要和 $b 共用一室了。因而任何對儲存位址數值的改變都會影響兩個值。  

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

程式碼如下:

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

  上面的例子非常簡答,以a<10作為判斷條件,條件成立,則把a賦給result[];將result的參考傳入函數,會將每一次遞歸產生的a加到結果陣列result。因而本例產生的$result陣列是Array ( [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<10條件不滿足的時候,echo a,回傳result,對於上一層而言,執行完遞歸函數,開始執行本層的echo $a,依序類別推。

第二種方法:利用全域變數

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

程式碼如下:

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

第三種方法:利用靜態變數

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

  舉個栗子:

 程式碼如下:

function test(){
static $count=0;
echo $count;
$count++;
}
test();
test();
test();
test();
test();
  
登入後複製

        請問這段程式碼的執行結果是多少?是00000麼?必然不是。是01234。首先第一次呼叫test(),static$count 進行初始化,其後每一次執行完都會保留 $count 的值,不再進行初始化,相當於直接忽略了static $count=0; 這一句。

  因而將static應用到遞歸函數作用可想而知。在將需要作為遞歸函數間作為「橋樑"的變數利用static進行初始化,每一次遞歸都會保留"橋樑變數"的值。

 程式碼如下:

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

總結

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

function test($a=0){
    $a++;
    if ($a<10) {
        echo $a;
        test($a);
    }
}
登入後複製

  下面透過一段程式碼示範php使用遞歸函數實現數字累加的方法。

程式碼如下:

<?php
function summation ($count) {
   if ($count != 0) :
     return $count + summation($count-1);
   endif;
}
$sum = summation(10);
print "Summation = $sum";
?>
登入後複製

         面对php递归函数,不必要伤脑筋,深入的理解变量引用相关知识对解决此类问题很有帮助,以上内容就是php递归函数三种实现方法及如何实现数字累加的全部内容,希望对大家今后的学习有所帮助。

以上就是本文的全部内容,希望对大家的学习有所帮助,更多相关内容请关注PHP中文网!

相关推荐:

thinkPHP实现联动菜单的功能

php合并数组并保留键值的实现方法

以上是三種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脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

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

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

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

C++ 遞迴函數的最佳化技巧有哪些? C++ 遞迴函數的最佳化技巧有哪些? Apr 17, 2024 pm 12:24 PM

為了優化遞歸函數的效能,可以採用以下技巧:使用尾遞歸:將遞歸呼叫放在函數末尾,避免遞歸開銷。備忘錄化:儲存已計算的結果,避免重複計算。分治法:分解問題,遞歸解決子問題,提高效率。

如何解決Python的程式碼中的函數嵌套過多錯誤? 如何解決Python的程式碼中的函數嵌套過多錯誤? Jun 25, 2023 pm 12:35 PM

Python是一門非常強大的程式語言,許多程式設計師都選擇Python作為主要的程式語言。但是,程式碼中過多的函數嵌套會導致程式難以維護和理解。本文將探討如何解決Python的程式碼中的函數嵌套過多錯誤。函數巢狀淺談函數巢狀是指在一個函數的主體中定義另外一個函數的過程。函數巢狀可以使程式的結構更加清晰,程式碼也更易於閱讀和維護。但是,函數巢狀過多會導致程式碼結構過於複雜

C++ 遞迴函數的退出條件是什麼? C++ 遞迴函數的退出條件是什麼? Apr 17, 2024 am 11:33 AM

C++遞迴函數的退出條件包括:基線條件:檢查函數是否達到可直接傳回結果的狀態,通常判斷某個條件或參數值是否符合閾值。遞歸終止條件:替代或補充基線條件,確保函數在一定數量的遞歸呼叫後停止,透過追蹤遞歸深度或設定最大遞歸深度限制實現。

C++ 遞迴函式在搜尋演算法中的應用? C++ 遞迴函式在搜尋演算法中的應用? Apr 17, 2024 pm 04:30 PM

遞歸函數在搜尋演算法中用於探索樹狀資料結構。深度優先搜尋使用堆疊探索節點,而廣度優先搜尋使用佇列按層遍歷。在實際應用中,如查找檔案中,遞歸函數可用於在指定目錄中搜尋給定檔案。

C++ 遞歸函數的尾遞歸最佳化策略如何實現? C++ 遞歸函數的尾遞歸最佳化策略如何實現? Apr 17, 2024 pm 02:42 PM

尾遞歸最佳化策略透過將尾遞歸呼叫轉換為循環,有效減少函數呼叫堆疊深度,防止堆疊溢位。最佳化策略包括:偵測尾遞歸:檢查函數中是否存在尾遞歸呼叫。將函數轉換為循環:使用循環來代替尾遞歸調用,並維護堆疊保存中間狀態。

C++ 遞歸函數在排序演算法中的應用? C++ 遞歸函數在排序演算法中的應用? Apr 17, 2024 am 11:06 AM

C++中遞歸函數在排序演算法中的應用透過遞歸函數實現的插入排序和歸併排序演算法,可以將複雜的問題分解為更小的子問題,並透過遞歸呼叫高效地解決。插入排序:透過逐一插入元素,將陣列有序化。歸併排序:分而治之,將數組拆分並遞歸排序子數組,最後將排序後的子數組合併。

如何使用Go語言遞歸函數實現階乘? 如何使用Go語言遞歸函數實現階乘? Jul 31, 2023 pm 08:31 PM

如何使用Go語言遞歸函數實現階乘?階乘是數學中常見的一種計算方式,它將一個非負整數n乘以比它小的所有正整數,直到1。例如,5的階乘可以表示為5!,計算方式為54321=120。在計算機程式設計中,我們經常使用遞歸函數來實現階乘的計算。首先,我們需要了解遞歸函數的概念。遞歸函數是指在函數的定義中呼叫函數本身的過程。在解決問題時,遞歸函數會不斷地

列出目錄中的所有檔案和子目錄的C程序 列出目錄中的所有檔案和子目錄的C程序 Aug 25, 2023 pm 10:09 PM

在這裡,我們得到了一個目錄。我們的任務是建立一個C程式來列出目錄中的所有檔案和子目錄。目錄是一個地方/區域/位置,其中一組檔案(s)將被儲存。子目錄是根目錄中的一個目錄,反過來,它可以有另一個子目錄。在C程式語言可以輕鬆列出目錄中的所有檔案和子目錄。下面的程式將說明如何列出目錄中的所有檔案和子目錄。 //列出目錄中所有檔案和子目錄的C程式範例 現場示範#include<stdio.h>#include<dirent.h>intmain(void){ &am

See all articles