C语言递归李白打酒

本文探讨了如何使用C语言来解决一个有趣的数学问题:李白提壶打酒的故事。问题描述李白在遇到酒馆和花朵时饮酒的特定情况,通过递归算法找出所有可能的遇店和遇花的次序,最后计算所有合理方案的数量。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目描述:

话说大诗人李白,一生好饮。幸好他从不开车。 

一天,他提着酒壶,从家里出来,酒壶中有酒2斗。他边走边唱:

无事街上走,提壶去打酒。  逢店加一倍,遇花喝一斗。  这一路上,他一共遇到店5次,遇到花10次,已知最后一次遇到的是花,他正好把酒喝光了。 请你计算李白遇到店和花的次序,可以把遇店记为a,遇花记为b。则:babaabbabbabbbb 就是合理的次序。像这样的答案一共有多少呢?请你计算出所有可能方案的个数(包含题目给出的)。

#include <stdio.h>  
  
int count = 0;  
  
void libai(int store, int flower,int alco, int pre, char *ch, int index)  
{  
    if(store == 0 && flower == 0)  
    {  
        if(alco == 0 && pre == 0)  
        {  
            int i;  
            for(i = 0;i < 15; i++)  
            {  
                printf("%c",ch[i]);  
            }  
            printf("\n");  
            count++;  
        }  
        return;  
    }  
      
    if(store > 0)  
    {  
        ch[index] = 'a';  
        libai(store - 1, flower, alco * 2, 1, ch, index + 1);  
    }  
    if(flower > 0)  
    {  
        ch[index] = 'b';  
        libai(store, flower - 1, alco - 1, 0, ch, index + 1);  
    }  
}  
  
void libai2(int alco, int store, int flower, char *ch, int index)  
{  
    if(store > 5 || flower > 10)  
    {  
        return;  
    }  
    if(store == 5 && flower ==9)  
    {  
        if(alco == 1)  
        {  
            int i;  
            for(i = 0;i < 15; i++)  
            {  
                printf("%c",ch[i]);  
            }  
            printf("\n");  
            count++;  
        }  
        return;  
    }  
    ch[index] = 'a';  
    libai2(alco * 2, store + 1, flower, ch, index + 1);  
    ch[index] = 'b';  
    libai2(alco - 1, store, flower + 1, ch, index + 1);  
}  
  
int main()  
{  
    char ch[20];  
        
    libai2(2, 0, 0, ch, 0);  
      
    printf("%d\n",count);  
      
    return 0;  
}  

本题就是一个不断递归的函数,假定先遇到店,然后递归计算直到满足打酒喝酒的条件就将计算符+1;再假定先遇到花,然后递归计算剩下的可能。遇到满足要求的组合就加1。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值