递归

我突然意识到我好想很久没有写算法类型的博文了,所以今天来写一个算法类的。
今天我介绍的这种算法名字叫递归,是很暴力,但又很简单(暴力一般都很简单)的算法。
我不知道大家有没有画过这种图:
在这里插入图片描述这个我们叫做二叉树,图中最后有16个点,也就对应着16种可能性,如果需要你编写一个程序来模拟这16种可能性的话或许还比较简单,但是如果数据变大,比如我们有1000层,那怎么办总不能一个一个模拟吧。
所以这时候我们就需要用到递归算法。
先说实现方法,实现方法就是编写一个函数(不是main)然后每次都调用2次函数,分别模拟左分叉和右分叉,知道最后达到目标层数再向上一层返回结果(答案)
用图来表示就是这样的:
首先每个球都先选择左手边的在这里插入图片描述
然后一直到最后一个检测到到底了,返回到上一层(第四层)在这里插入图片描述接着第四层再选择右边的在这里插入图片描述
右边的检测到底了再返回上一层在这里插入图片描述
上一层(第四层)两边都选择完了,再返回到第三层在这里插入图片描述

第三层继续选择右边的,以此类推······在这里插入图片描述
这样递归的原理就解释清楚了,再说一个很抽象,但是我个人觉得非常有用的技巧,就是把自己想象成那个球,每个球只需要干好自己的活,然后把答案返回到上级就可以了,其余的一律不管。
原理解释清楚之后就该实际操作了,这里我们用洛谷上的的一道题来示范。
题目是洛谷的 P1164 小A点菜
在这里插入图片描述
这里先多嘴一句,大家也能看到有个人在今年八月底新增了一个数据,也就是验证点11,导致现在使用我的方法最后一个点会TLE(超时)但是在之前是完全没有问题的,这道题本来也是练习,所以优化什么的我就不说了,先看90分代码:

#include<iostream>
#include<cstdio>
#include<cstring>//因为这是我很久之前写的代码,所以头文
//件和其他的一些表达方式可能与现在不同,凑活着看吧
//头文件有个几乎万能的:#include<bits/stdc++.h>现在我基
//本都用它
using namespace std;
int a[
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值