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