一般來說,類似這種遍歷輸出所有文件,大多採用遞歸演算法,這樣程序顯得比較簡潔,其實際執行效率來說,並不見得比其他方法更好。
以下是示例:
function file_list($path)
{
if ($handle = opendir($path))//打開路徑成功
{
while (false !== ($file = readdir($handle)))//循環讀取目錄中的文件名並賦值給$file
{
if ($file != "." && $file != "..")//排除當前路徑和前一路徑
{
if (is_dir($path."/".$file))
{
// echo $path.": ".$file."<br>";//去掉此行顯示的是所有的非目錄文件
file_list($path."/".$file);
}
else
{
echo $path.": ".$file."<br>";
}
}
}
}
}
Ⅱ 求經典的遞歸演算法以及案例(可用C#、PHP、JAVA其中一種語言來寫)!
我用C#來寫(注意,更多的請直接到我的個人博客,點擊, http://www.cnblogs.com/serviceboy/archive/2009/07/19/1526590.html,收看) 【例1】有甲、乙、丙、丁四人,從甲開始到丁,一個比一個大1歲,已知丁10歲,問甲幾歲?【分析】這是遞歸法的一道非常典型的題目——因為我們可以很顯然知道:假設要計算甲的年齡,那麼必須直到乙的年齡;同樣,算乙的必須直到丙的,算丙的必須知道丁的,因為丁已知,自然可以往前推算了。現在假設有一個數學模型(函數)可以計算出他們各自的年齡(方便期間我們給他們編號——甲=1,乙=2,丙=3,丁=4),那麼存在這一個F(X)函數,X表示某人的編號,其規律如下:F(1)=F(2)+1F(2)=F(3)+1F(3)=F(4)+1F(4)=10顯然,直到X=4的時候是一個終止值,其餘情況下都是返回F(X』),F(X』』)……F(X』』……』),且前者總是比後至大1,這也符合了X』和X總是呈現一定函數關系(設想一下,如果不是等差和等比,又怎麼可能在一個遞歸函數中進行計算?要知道,函數本身就是一個公式表示,既然是公式,那麼一定是一種函數關系Y=F(X)),此處顯然X和X』的關系是X=X』+1。根據規律式,我們可以寫出該遞歸函數:int AgeCal(int id)
{
if(id==4) return 10;
else
return (AgeCal(id+1)+1);
} 【例2】計算n!【分析】雖然這道題目不像例1一樣清晰明了告訴你使用「遞歸」法反推,但是我們有這樣一個常識——n!=(n-1)!*n;(n-1)!=(n-2)!*(n-1)……n=0或1,返回1.顯然n與n-1,n-2也是線性的遞減數列(等差關系)。其規律如下:F(n)=F(n-1)*nF(n-1)=F(n-2)*(n-1)F(n-2)=F(n-3)*(n-2)……F(1)=1或者F(0)=1(防止別人直接輸入0)編寫其遞歸函數,如下:int Fac(int n)
{
if(n==1 || n==0)
{
return 1;
}
else
return Fac(n-1)*n;
} 【例3】求一組整數中的最大(小)值(整數是一個int[]數組,個數未知)。【分析】當數字只有兩個的時候,我們可以使用>和<直接比較;但是當數字超過2個的時候(假設3個),那麼我們可以使用一個預訂的函數(比如Max(1,2)和3進行比較),由於1,2兩個數比較的時候已經得到一個最大值,因此在回代到Max中又變成了兩個數的比較。這樣,我們可以發現一個規律:F(1,2,3,4……n)=F(1,2,3,4……n-1)和n比較F(1,2,3,4……n-1)=F(1,2,3,4……n-2)和n-1比較……F(1,2,3)=F(1,2)和3比較F(1,2)=結果(並回代)相應的遞歸函數如下(C#):Code
int Max(int[]numbers)
{
if(numbers.Length==2)
{
return (numbers[0]>numbers[1]?numbers[0]:numbers[1]);
}
else
{
int[]tempnumbers=new int[numbers.Length-1];
for(int i=0;i<numbers.Length-1;++i)
{
tempnumbers[i]=numbers[i];
}
return (Max(tempnumbers)>numbers[numbers.Length-1]? Max(tempnumbers): numbers[numbers.Length-1]
}
}
Ⅲ 急!用php 遞歸法求n的階乘
<?php
function f($n)
{
$out = -1;
if($n<0)
echo "輸入不能是負數";
else if($n==0||$n==1)
$out=1;
else $out=f($n-1)*$n;
return $out;
}
echo f(6);
?>
Ⅳ php 幾種常用的遞歸 無限極分類
/**
*遞歸實現無限極分類
*@param$array分類數據
*@param$pid父ID
*@param$level分類級別
*@return$list分好類的數組直接遍歷即可$level可以用來遍歷縮進
*/
functiongetTree($array,$pid=0,$level=0){
//聲明靜態數組,避免遞歸調用時,多次聲明導致數組覆蓋
static$list=[];foreach($arrayas$key=>$value){//第一次遍歷,找到父節點為根節點的節點也就是pid=0的節點
if($value['pid']==$pid){//父節點為根節點的節點,級別為0,也就是第一級
$value['level']=$level;//把數組放到list中
$list[]=$value;//把這個節點從數組中移除,減少後續遞歸消耗
unset($array[$key]);//開始遞歸,查找父ID為該節點ID的節點,級別則為原級別+1
getTree($array,$value['id'],$level+1);
}
}
Ⅳ 遞歸演算法舉例
int intSum(int n)
{
if(20 == n) //當等於20的時候返回20
{
return n;
}
return n + intSum(n+1); //遞歸
}
我沒驗證這個,但是基本就是這樣的,你可以試試
Ⅵ PHP怎麼遞歸
下面我舉一個其他的例子,雖然不是族譜,但是原理都是一樣的。
在一些復雜的系統中,要求對信息欄目進行無限級的分類,以增強系統的靈活性。那麼PHP是如何實現無限級分類的呢?我們在本文中使用遞歸演算法並結合mysql數據表實現無限級分類。
遞歸,簡單的說就是一段程序代碼的重復調用,當把代碼寫到一個自定義函數中,將參數等變數保存,函數中重復調用函數,直到達到某個條件才跳出,返回相應的數據。
Mysql
首先我們准備一張數據表class,記錄商品分類信息。表中有三個欄位,id:分類編號,主鍵自增長;title:分類名稱;pid:所屬上級分類id。
class表結構:
CREATE TABLE IF NOT EXISTS `class` (
`id` mediumint(6) NOT NULL AUTO_INCREMENT,
`title` varchar(30) NOT NULL,
`pid` mediumint(6) NOT NULL DEFAULT '0',
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
插入數據後,如圖:
如果要輸出json格式的數據,則可使用:
echo json_encode($list);
Ⅶ 可以列舉幾個簡單的php遞歸例子嗎
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
//遞歸獲得角色ID字元串
function explodeRole($roleObj, &$resultStr){
if(0 < count($roleObj->childRoleObjArr)){
foreach($roleObj->childRoleObjArr as $childRoleObj){
if('' == $resultStr){
$resultStr .= "{$childRoleObj->id}";
}else{
$resultStr .= ", {$childRoleObj->id}";
}
explodeRole($childRoleObj, $resultStr);
}
}
}
//遞歸獲取級聯角色信息數組
function makeRoleRelation(&$roleObjArr){
foreach($roleObjArr as $item){
$item->childRoleObjArr = getRoleObjArrByParentId($item->id);
if(0 < count($item->childRoleObjArr)){
makeRoleRelation($item->childRoleObjArr);
}
}
}
//通過父角色的id獲取子角色信息
function getRoleObjArrByParentId($parentid){
$operCOGPSTRTSysRole = new COGPSTRTSysRole();
$operCOGPSTRTSysRole->setColumn($operCOGPSTRTSysRole->getAllColumn());
$operCOGPSTRTSysRole->setWhere("parentroleid={$parentid}");
$roleObjArr = $operCOGPSTRTSysRole->convResult2ObjArr($operCOGPSTRTSysRole->selectTable());
return isset($roleObjArr)?$roleObjArr:array();
}
php的遞歸函數用法
一個函數在它的函數體內調用它自身稱為遞歸調用。這種函數稱為遞歸函數。這對於程序員來說,通常有很高的實用價值,常用來將復雜的問題分解為簡單的並相同的情況,反復做這種處理直到問題解決。
用遞歸函數與不用遞歸函數的區別
示例一:使用靜態變數
?
1
2
3
4
5
6
7
8
function test(){
static $dig=0;
if($dig++<10){
echo $dig;
test();
}
}
test();//12345678910
示例二:使用遞歸函數和循環實現字元串逆轉排列
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
function unreverse($str){
for($i=1;$i<=strlen($str);$i++){
echo substr($str,-$i,1);
}
}
unreverse("abcdefg");//gfedcbc
function reverse($str){
if(strlen($str)>0){
reverse(substr($str,1));
echo substr($str,0,1);
return;
}
}
reverse("abcdefg");//gfedcbc
遞歸函數很多時候我們可以循環替代,建議當我們不能用循環替代時再用,因為用循環我們更容易理解,更不容易出錯。
php遞歸函數
php支付遞歸函數,遞歸函數就是調用自己本身,這些函數特別適用於瀏覽動態數據結構,例如樹和列表。
幾乎沒有web應用程序要求使用復雜的數據結構
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<?php
function reversr_r($str)
{
if (strlen($str)>0)
reverse_r(substr($str,1));
echo substr($str,0,1);
return;
}
?>
<?php
function reverse_i($str)
{
for($i=1;$i<=strlen($str);$i++)
{
echo substr($str,-$i,1);
}
}
這個程序清單中實現兩個函數,這兩個函數都可以相反的順序列印字元串的內容
函數reversr_r是通過遞歸實現的,而函數reverse_i()是通過循環實現的
Ⅷ python遞歸演算法經典實例有哪些
程序調用自身的編程技巧稱為遞歸( recursion)。遞歸做為一種演算法在程序設計語言中廣泛應用。 一個過程或函數在其定義或說明中有直接或間接調用自身的一種方法。
它通常把一個大型復雜的問題層層轉化為一個與原問題相似的規模較小的問題來求解,遞歸策略只需少量的程序就可描述出解題過程所需要的多次重復計算,大大地減少了程序的代碼量。
遞歸的能力在於用有限的語句來定義對象的無限集合。一般來說,遞歸需要有邊界條件、遞歸前進段和遞歸返回段。當邊界條件不滿足時,遞歸前進;當邊界條件滿足時,遞歸返回。
Python
是完全面向對象的語言。函數、模塊、數字、字元串都是對象。並且完全支持繼承、重載、派生、多繼承,有益於增強源代碼的復用性。Python支持重載運算符和動態類型。相對於Lisp這種傳統的函數式編程語言,Python對函數式設計只提供了有限的支持。有兩個標准庫(functools, itertools)提供了Haskell和Standard ML中久經考驗的函數式程序設計工具。
Ⅸ php遞歸演算法 如何計算1到100的奇數和
functiongetQ($num,$sum=0){
$numQ=$num%2==0?$num-1:$num;
return$numQ<=0?$sum:getQ($numQ-2,$sum+$numQ);
}
echogetQ(100);
以上.
Ⅹ php獲得文件夾下所有文件的遞歸演算法的簡單實例
如下所示:
function
my_scandir($dir)
{
$files=array();
if(is_dir($dir))
{
if($handle=opendir($dir))
{
while(($file=readdir($handle))!==false)
{
if($file!="."
&&
$file!="..")
{
if(is_dir($dir."/".$file))
{
$files[$file]=my_scandir($dir."/".$file);
}
else
{
$files[]=$dir."/".$file;
}
}
}
closedir($handle);
return
$files;
}
}
}
以上就是小編為大家帶來的php獲得文件夾下所有文件的遞歸演算法的簡單實例全部內容了,希望大家多多支持腳本之家~