回溯算法以及剪枝问题理解

本文回顾了递归的概念,并通过力扣第77题解析了如何使用回溯算法解决组合问题。分析递归树,介绍了如何进行剪枝优化,避免无效搜索。例如,当寻找n=8,k=5的组合时,从5开始搜索就没有意义,循环上界可调整为n - (k - path.size()) + 1,以提高效率。" 124347790,11970654,解决Windows与Linux上Tomcat及项目启动故障,"['tomcat', '故障排查', '系统管理', '服务器运维', '数据库']
摘要由CSDN通过智能技术生成

回溯算法以及剪枝问题理解

关于递归的简单回顾

程序调用自身的编程技巧称为递归。

举例说明一下:

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

  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值