一般来讲,人们常常提及的回溯,通常指走不通就掉头。另一种情况,路走完了,回到开始的地方重新选择另一条路,也可称之为回溯——下面是重点。
几乎所有回溯的写法,都是for循环里嵌套着递归。如果不存在走不通的情况,则无条件递归,否则,就用if判断是回到上一层还是进入下一层,下面用相关代码片段说明。
全排列
function f($a,$str=''){
if(count($a)==1){
$_GET[]=$str.$a[0];
return ;
}
for($i=0;$i<count($a);$i++){
list($a[0],$a[$i])=[$a[$i],$a[0]];
f(array_slice($a,1),$str.$a[0]);
}
}
可以看到,无条件的递归。
八皇后
function bhh($a=[],$n=0){
if(count($a)==8){
$_GET[]=$a;
print_r($a).' ';
return;
}
for($i=0;$i<8;$i++){
if($n==0){
$a[0]=$i;
bhh($a,$n+1);
}else{
$bool=true;
foreach($a as $k=>$v){
if($i==$v or abs($i-$v)==$n-$k){
$bool=false;
break;
}
}
if($bool){
$a[$n]=$i;
bhh($a,$n+1);
}
}
}
}
可以看到,在for里面有相关的条件判断代码——如果不满足,则回到上一层。
关于二者的结合,有兴趣的同学可移步至:用全排列的方法解决八皇后问题。