回溯法就是类似穷举,类似下面的3个for循环,他们的结果是一样的。这个例子中可能结果出现111,122这样重复的,需要优化,其实只要在 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";
}
}
}
*/
网友评论