數據結構與算法之遞歸算法 C++和PHP實現

遞歸算法:就是一種直接或間接調用自身的算法。
實現過程:通過函數或者子過程來完成,在函數或者子過程中編寫代碼直接或間接的調用自己,即可完成遞歸操作。(相同類別的問題,把問題層層轉換爲規模縮小的子問題到最小問題有已知條件,然後來求解,然後得到結果逐級返回。其實也是一種循環。)
最主要體現:小的代碼量解決了非常複雜的問題
特點:
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] = '\0';
}
運行結果:


實例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);
?>
運行結果:


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章