题目:
话说大诗人李白,一生好饮。幸好他从不开车。
一天,他提着酒壶,从家里出来,酒壶中有酒2斗。他边走边唱:
无事街上走,提壶去打酒。
逢店加一倍,遇花喝一斗。
这一路上,他一共遇到店5次,遇到花10次,已知最后一次遇到的是花,他正好把酒喝光了。
请你计算李白遇到店和花的次序,可以把遇店记为a,遇花记为b。则:babaabbabbabbbb 就是合理的次序。像这样的答案一共有多少呢?请你计算出所有可能方案的个数(包含题目给出的)。
思路:
1、递归函数的调用;
2、递归出口。
题目解答:
#include<iostream>
#define SHOP 1 //定义遇店
#define FLOWER 0 //定义遇花
#define Ori_amount 2 //原始酒量
int Ans_nums = 0; //定义全局变量记录满足条件的方案个数
using namespace std;
/**
*ToDo:函数判定喝酒打酒
*@prarm a:遇店 drinking_amount += drinking_amount;
*@prarm b:遇花 drinking_amount -= 1
*@prarm drinking_amount:在进行本轮操作之前的酒的量
*/
void LiBaiSee(int a,int b,int drinking_amount);
int main()
{
LiBaiSee(5,10,Ori_amount);
cout << "共有方案:" << Ans_nums << "种";
return 0;
}
void LiBaiSee(int a,int b,int drinking_amount)
{
if(a < 0 || b < 0 || drinking_amount < 0)
return; //不满足条件遍历结束
if(a == 0 && b == 1 && drinking_amount == 1) //已知最后一次遇到花
{
Ans_nums++; //符合最终条件方案数目+1
return;
}
LiBaiSee(a - 1,b,2 * drinking_amount); //逢店加一倍
LiBaiSee(a,b - 1,drinking_amount - 1); //遇花喝一斗
}
我的扩展:
扩展内容:输出方案列表
思路:找到对应的递归出口
代码:
暂时无法扩展:等后面学习
收获:
对于递归使用的认识:如果存在一个问题,他是由多次重复性操作完成且前后操作之间存在着一定的联系。使用递归。
【看书内容】(未完成)