【每日一题】-20180806【李白打酒】(未完善)

题目:

话说大诗人李白,一生好饮。幸好他从不开车。
一天,他提着酒壶,从家里出来,酒壶中有酒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);           //遇花喝一斗
}
我的扩展:

扩展内容:输出方案列表
思路:找到对应的递归出口

代码:
暂时无法扩展:等后面学习
收获:

对于递归使用的认识:如果存在一个问题,他是由多次重复性操作完成且前后操作之间存在着一定的联系。使用递归。
【看书内容】(未完成)

猜你喜欢

转载自blog.csdn.net/Chaoyuan_Jam/article/details/81462250