鍍金池/ 問(wèn)答/PHP  C++  網(wǎng)絡(luò)安全  HTML/ 關(guān)于PHP的遞歸傳參.為什么第一種能得到想要的值,第二種不行呢?請(qǐng)解答.

關(guān)于PHP的遞歸傳參.為什么第一種能得到想要的值,第二種不行呢?請(qǐng)解答.

一個(gè)php的全排列函數(shù)

function getAll($array,$str=null){        
    $length = count($array);
    if($length<=1){
        echo $str.$array[0].PHP_EOL;
    }else{    
        for($i=0;$i<$length;$i++){
            $temp = $array;
            array_splice($temp,$i,1);
            //print_r($temp);        
            getAll($temp,$str.$array[$i]); 
        }
    }
}

$array = [a,b,c]
輸出
abc
acb
bac
bca
cab
cba
是正確的.但是

function getAll2($array,$str=null){    
    $length = count($array);
    if($length<=1){
        echo $str.$array[0].PHP_EOL;
    }else{
        for($i=0;$i<$length;$i++){
            $temp = $array;
            array_splice($temp,$i,1);
            $str =$str.$array[$i];
            getAll2($temp,$str); 
        }
    }
}

僅僅變化了一點(diǎn)點(diǎn),$str =$str.$array[$i];getAll2($temp,$str);
換了一下傳遞參數(shù)的方法,整個(gè)輸出就變了.請(qǐng)問(wèn)能解釋一下問(wèn)什么嗎?

回答
編輯回答
薔薇花

因?yàn)樵趃etAll2中. for循環(huán)里面:

$str =$str.$array[$i];

你對(duì)str進(jìn)行了重新賦值,而第一個(gè)str沒(méi)有被重新賦值,只是單純拼了個(gè)新的傳進(jìn)去.

把第二個(gè)改成這樣也是正常的:

function getAll2($array,$str=null){    
    $length = count($array);
    if($length<=1){
        echo $str.$array[0].PHP_EOL;
    }else{
        for($i=0;$i<$length;$i++){
            $temp = $array;
            array_splice($temp,$i,1);
            $str2 =$str.$array[$i];
            getAll2($temp,$str2); 
        }
    }
}
2017年12月24日 05:39