遞迴演算法實踐---實現排列組合

lxzoliver發表於2020-03-21

在進行電商的業務場景開發過程中,商品的屬性需要使用到排列組合的演算法去實現商品的sku屬性

而對於排列組合演算法可使用遞迴的方式解決:

//以$arr陣列為例:
$arr = [['a','b','c'],['a','b'],['a','b','c','d','e']];

需將陣列內的各個子陣列裡的值排列組合如aaa,aab,aac,aad,aae,aba這樣的返回值

遞迴總結中

遞迴需要滿足的三個條件

  1. 一個問題的解可以分解為幾個子問題的解
  2. 這個問題與分解之後的子問題,除了資料規模不同,求解思路完全一樣
  3. 存在遞迴終止條件

可以將問題拆分為n-1個雙重迴圈,如先將前兩組陣列遍歷組合成aa,ab,ba,bb,ca,cb,再將得到的陣列與下一陣列迴圈遍歷就可得到最終排列組合的結果

實現程式碼如下:

$arr = [['a','b','c'],['a','b'],['a','b','c','d','e']];

    function recursiveArray($arr,$i=0,$data=[]){
        $j=$i+1;
        if(count($arr)==1){
            return $arr;
        }else{
            if($j>=count($arr)){
                return $data;
            }
            if(!$data){
                $z=0;
                foreach($arr[$i] as $k1=>$v1){
                    foreach($arr[$j] as $k2=>$v2){
                        $data[$z]=$v1.$v2;
                        $z++;
                    }
                }
                $i++;
                return $this->recursiveArray($arr,$i,$data);
            }else{
                $z=0;
                foreach($data as $k1=>$v1){
                    foreach($arr[$j] as $k2=>$v2){
                        $data[$z]=$v1.$v2;
                        $z++;
                    }
                }
                $i++;
                return $this->recursiveArray($arr,$i,$data);
            }
        }

    }

以上:bowtie:

本作品採用《CC 協議》,轉載必須註明作者和本文連結

相關文章