回溯算法以及剪枝问题理解
关于递归的简单回顾
程序调用自身的编程技巧称为递归。
举例说明一下:
public void Recursion(int n){
if(n>0){
Recursion(n-1);
printf("%d\n",n);
}
}
当n=2的时候首先执行Recursion(2),接着执行Recursion(1),最后结果就是1和2。
递归的调用实质就像是一个堆栈,当我们执行Recursion(2)的时候发现无法得到结果并且接着执行Recursion(1),此时就相当于把Recursion(2)存入栈中,然后执行完Recursion(1)的再从栈中取出Recursion(2)执行得到结果。
如果是for循环加上递归呢
public void Recursion(int n){
for(int i=1;i<=3;i++)
{
if(n>0)
{
Recursion(n-1);
printf("%d\n",n);
}
}
}
对于这种问题,我个人认为一个很好的办法就是去分层理解。
Recursion(2)-> 输出次数:3^1
调用3次Recursion(1)
输出三次2
每一次的Recursion(1)-> 输出次数:3^2
调用3次Recursion(0)
输出三次1