算法初探——遞歸算法

遞歸算法

什麼是遞歸算法?

簡單的理解就是,函數裏面直接或者間接的調用函數自己.php

遞歸函數的特色

1.函數累不調用自己
2.須要有明確的結束條件,否則容易形成死循環.
3.遞歸函數的代碼當然簡潔,可是執行效率較低,須要結合本身的需求制定相應的算法,不推薦使用遞歸.
4.遞歸函數的執行順序依次是從外部執行到最裏層,當知足限制條件的時候,依次從內部執行到最外層.算法

算法實戰  

需求

使用遞歸函數和棧逆序一個棧(只能使用棧一種數據結構)數據結構

解題思路(兩個遞歸函數)

1.獲取一個棧的棧底元素刪除而且返回最底層元素.
2.利用1種的遞歸函數,逆序這個棧函數

邏輯代碼
/**
 * 獲取而且刪除棧的最後一個元素
 */
function getAndRemoveLastElement (&$stack)
{
    // 彈出最外層的元素.
    $element = array_pop($stack);

    if (!empty($stack)) {
        $last = getAndRemoveLastElement($stack);
        array_push($stack,$element);
        return $last;
    } else {
        // 遞歸的結束條件,棧爲空.
        return $element;
    }
}
/**
 * 逆序這個棧.
 * @param $stack
 */
function reverse (&$stack)
{
    // 遞歸退出的限制條件.
    if (!empty($stack)) {
        $i = getAndRemoveLastElement($stack);// 未符合如今條件時,依次從外到裏面執行.
        reverse($stack); // 符合限制條件後依次從裏到外向下執行.
        array_push($stack,$i);
    } else {
        // 爲空就返回.
        return ;
    }
}
<?php
$stack = array(1,2,3,4,5);
reverse($stack);
var_dump($stack);

輸出爲code

array(5) {
  [0]=>
  int(5)
  [1]=>
  int(4)
  [2]=>
  int(3)
  [3]=>
  int(2)
  [4]=>
  int(1)
}
相關文章
相關標籤/搜索