酒干倘卖无之递归算法

Posted 廉颇老矣.

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了酒干倘卖无之递归算法相关的知识,希望对你有一定的参考价值。

酒干倘卖无之递归算法

还记得那首老歌么,酒干倘卖无,它蕴含着一个多么辛酸的故事。生活不易,勤俭节约资源回收再利用吧!
孩子的寒假作业还没做吧,里面一定有这样让大人都蒙圈的题目,计算机的酒量那是秒杀千百万瓶!

题目:

  • 啤酒2元1瓶,4个瓶盖换一瓶,2个空瓶换1瓶
  • 问:100块钱可以喝多少瓶

递归算法实现:

#define N   50
int total = 0;
int round = 0;

void beer_bottle_lid(int beer, int bottle, int lid)
{
    round++;
    printf ("第%d轮:喝了%d瓶酒,剩下%d个空瓶子,剩下%d个瓶盖子\n", round, beer, bottle, lid);

    int beer1 = (bottle)/2;
    int beer2 = (lid)/4;
    int bot = (bottle)%2;
    int li = (lid)%4;

    int new_beer = (beer1+beer2);
    int new_bottle = (new_beer+bot);
    int new_lid = (new_beer+li);

    total += new_beer;  

    if (new_beer == 0){
        return;
    }

    beer_bottle_lid(new_beer, new_bottle, new_lid);


}
//---------------------------
int main(void)
{
    total += N;
    beer_bottle_lid(N, N, N);

    printf ("\n\r总共喝了瓶酒,也是醉了!\n", total);
    return 0;
}

测试结果

第1轮:喝了50瓶酒,剩下50个空瓶子,剩下50个瓶盖子
第2轮:喝了37瓶酒,剩下37个空瓶子,剩下39个瓶盖子
第3轮:喝了27瓶酒,剩下28个空瓶子,剩下30个瓶盖子
第4轮:喝了21瓶酒,剩下21个空瓶子,剩下23个瓶盖子
第5轮:喝了15瓶酒,剩下16个空瓶子,剩下18个瓶盖子
第6轮:喝了12瓶酒,剩下12个空瓶子,剩下14个瓶盖子
第7轮:喝了9瓶酒,剩下9个空瓶子,剩下11个瓶盖子
第8轮:喝了6瓶酒,剩下7个空瓶子,剩下9个瓶盖子
第9轮:喝了5瓶酒,剩下6个空瓶子,剩下6个瓶盖子
第10轮:喝了4瓶酒,剩下4个空瓶子,剩下6个瓶盖子
第11轮:喝了3瓶酒,剩下3个空瓶子,剩下5个瓶盖子
第12轮:喝了2瓶酒,剩下3个空瓶子,剩下3个瓶盖子
第13轮:喝了1瓶酒,剩下2个空瓶子,剩下4个瓶盖子
第14轮:喝了2瓶酒,剩下2个空瓶子,剩下2个瓶盖子
第15轮:喝了1瓶酒,剩下1个空瓶子,剩下3个瓶盖子

总共喝了195瓶酒,也是醉了

以上是关于酒干倘卖无之递归算法的主要内容,如果未能解决你的问题,请参考以下文章

Java基础入门五)之方法以及递归算法

JavaScript - 代码片段,Snippets,Gist

以下代码片段的算法复杂度

有人可以解释啥是 SVN 平分算法吗?理论上和通过代码片段[重复]

片段(Java) | 机试题+算法思路+考点+代码解析 2023

CSP核心代码片段记录