回溯法

作者: lifefruity | 来源:发表于2021-01-18 23:06 被阅读0次

    回溯法就是类似穷举,类似下面的3个for循环,他们的结果是一样的。这个例子中可能结果出现111,122这样重复的,需要优化,其实只要在 let =able[$i] 的后面插入以下就行

    if(in_array($let, $selected)){
        continue;
    }
    
    <?php
    //利用回溯法,写出1,2,3组成的全排列
    
    
    //就是穷举的例子
    function func($selected, $able){
        if(count($selected) == 3){
            echo implode('', $selected)."\n";
            return;
        }
        
        for($i = 0; $i < count($able); $i++){
            //step 1. 可选解【放入】到已选集合中
            $let = $able[$i];
            $selected[] = $let;
    
    
            //step 2. 进入下一个阶段
            func($selected, $able);
            
            //这里其实应该说是满足selected为3后,进行依次回溯
            
            //var_dump($selected);exit;//这一句一打就知道了,111,112,113,一轮for完成了,然后最后的去除,再121,122,123开始,类似先进后出
            //step 3. "回溯"换个解再遍历(已选解集合中【删除】可选解)
            array_pop($selected);
            
            
        }
        
    }
    
    func([], [1,2,3]);
    
    /*
    $arr = [1,2,3];
    for($i = 0 ; $i < count($arr); $i++){
        for($j = 0 ; $j < count($arr); $j++){
            for($k = 0 ; $k < count($arr); $k++){
                //echo $arr[$i].$arr[$j].$arr[$k]."\n";
            }
        }
    }
    */
    

    相关文章

      网友评论

          本文标题:回溯法

          本文链接:https://www.haomeiwen.com/subject/xbufzktx.html