萬盛學電腦網

 萬盛學電腦網 >> 網絡編程 >> php編程 >> 用C++和PHP實現遞歸算法實例

用C++和PHP實現遞歸算法實例

最近在學習數據結構和算法,發現遞歸挺有意思,用想用php寫出來看看,以前還學C++,順便拿出來復習一下,做學習筆記如下。

遞歸算法:就是一種直接或間接調用自身的算法。

實現過程:通過函數或者子過程來完成,在函數或者子過程中編寫代碼直接或間接的調用自己,即可完成遞歸操作。(相同類別的問題,把問題層層轉換為規模縮小的子問題到最小問題有已知條件,然後來求解,然後得到結果逐級返回。其實也是一種循環。)

最主要體現:小的代碼量解決了非常復雜的問題

特點:
1、遞歸就是方法裡調用自身
2、必須有一個明確的遞歸結束條件,稱為遞歸出口。
3、簡潔但是運行效率較低,一般不提倡使用
4、每一層的返回點、局部變量等開辟了棧來存儲,遞歸次數過多容易造成棧溢出。

實例1:求階乘

C++代碼:


 代碼如下 復制代碼 #include<iostream>
int factorial(int n);
int main()
{
    using namespace std;
    int n;
    cout << "請輸入一個數字:";
    cin >> n;
    cout << n << "的階乘為: " << factorial(n) <<endl;
    return 0;
}
int factorial(int n)
{
    if (n == 1)
        return 1;
    return n*factorial(n-1);
}


實例2:數制轉換


代碼:

 代碼如下 復制代碼 #include<iostream>
#include<cstring>
void feelTheBase(char *s, int n, int sys);
int main()
{
    using namespace std;
    char s[60];
    int n,sys;
    cout << "請輸入一個整數:";
    cin >> n;
    cout << "請輸入要轉換的進制類型(2,8,16):";
    cin >> sys;
    feelTheBase(s, n, sys);
    cout << n << "轉換成" << sys << "進制結果為: " << s <<endl;
    return 0;
}
void feelTheBase(char *s, int n, int sys)
{
    char bit[] = {"0123456789ABCDEF"};
    int len;
    if (n == 0)
    {
        strcpy(s, "");
        return;
    }
    feelTheBase(s, n/sys, sys);
    len = strlen(s);
    s[len] = bit[n%sys];
    s[len+1] = '';
}


實例3:列出某個目錄下所有的子目錄和文件(還可以用scandir函數更方便)

PHP實現代碼:

 代碼如下 復制代碼 <?php
function rec($dir, $lev=0){
    $dh = opendir($dir);
 while (($file = readdir($dh)) != false) {
  if ($file == '.' || $file == '..') {
   continue;
  }
  if (is_dir($dir.'/'.$file)){
      $arr = explode("/",$dir.'/'.$file);
   $lev = count($arr)-3;
      echo str_pad('',$lev, "--")."目錄".$file."<br/>";
   rec($dir.'/'.$file, $lev+1);
  }else {
   echo str_pad('',$lev, "--").$file."<br/>";
     }
 }
 
 closedir($dh);
}
$dir = "./";
rec($dir);
?>

運行結果:

用C++和PHP實現遞歸算法實例-數據結構與算法學習

 

copyright © 萬盛學電腦網 all rights reserved