题目描述
话说大诗人李白,一生好饮。幸好他从不开车。
一天,他提着酒壶,从家里出来,酒壶中有酒2斗。他边走边唱:
无事街上走,提壶去打酒。
逢店加一倍,遇花喝一斗。
这一路上,他一共遇到店5次,遇到花10次,已知最后一次遇到的是花,他正好把酒喝光了。
请你计算李白遇到店和花的次序,可以把遇店记为a,遇花记为b。则:babaabbabbabbbb 就是合理的次序。像这样的答案一共有多少呢?请你计算出所有可能方案的个数(包含题目给出的)。
注意:通过浏览器提交答案。答案是个整数。不要书写任何多余的内容。
输入
没有输入
输出
一个整数
解题思路
很明显此题要用递归的方法,关键在于怎么编写递归函数,属于比较简单的题目,在熟悉递归的用法之后,就可以很容易写出。
由题意最后一次肯定为花,因此在倒数第二次时的情况为:经过9次花,5次店,并且剩下了一斗酒sum=1 。
#include <stdio.h>
int num = 0;
void f(int flower,int store,int sum) //flower记录遇到花的次数,store记录遇到店的次数,
// sum为当前酒的总数
{
if(flower>9 || store>5) // 判断递归的出口对于递归来说十分关键
return;
if(flower==9 && store==5) //由题意最后一次肯定为花,因此在倒数第二次时的情况为
//经过9次花,5次店,并且剩下了一斗酒sum=1
{
if(sum==1)
{
num++;
return;
}
else
return;
}
f(flower+1,store,sum-1); //遇花喝一斗,即sum-1
f(flower,store+1,sum*2); //遇店多一倍,即sum*2
}
int main ()
{
f(0,0,2); //初次递归的初始条件
printf("%d",num);
return 0;
}
答案:14
运行示例
感受
初学递归,深深感觉到了递归这种思想的神奇之处,这样写的代码太简洁了有木有,哈哈哈哈。