[하루에 한 질문] -20180806 [이백 주취] (완벽하지 않음)

이야기:

위대한 시인 이백은 평생 좋은 술을 마셨다 고한다. 다행히 그는 운전하지 않습니다.
어느 날 그는 술병을 들고 집에서 나왔는데 술병에는 포도주 두 통이있었습니다. 그는
걸어 가면서 노래를 불렀다 : 사고없이 길 걷고, 마실 냄비를 집어 든다.
모든 상점에서 두 배, 꽃을 만날 때 양동이를 마시십시오.
길을 가다가 가게를 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