美文网首页
递归使用-换汽水问题

递归使用-换汽水问题

作者: mysimplebook | 来源:发表于2019-10-29 14:02 被阅读0次

假如有这么一个问题,1瓶汽水1块钱,2个空瓶可以兑换一瓶汽水,问n块钱可以兑换多少瓶汽水?

考虑整个过程就是用空瓶不断兑换汽水的过程。又因为空瓶小于2个的时候就不能兑换汽水了,考虑将当前瓶数n可以分为n-1和1,同样将n-1分为n-2和1,依次类推。因此要想求得瓶数为n的时候可以兑换的汽水数,我们只需求得1个空瓶兑换的基本情况,再依次回溯,最终求得瓶数为n时的情况。所以采用递归的解法,

在每一个栈帧中,都是求当前空瓶数能兑换的汽水数,传入的参数为空瓶数,则可以兑换的汽水数为空瓶数对2求商,而递推传入下一个栈帧的参数值为兑换的汽水数(即空瓶数)加上余数(不能兑换的数量)。在递推到基础问题时,回溯返回给上一层调用函数。

其python实现代码为

def bottlechange(n):

    drinknum=n//2                     #空瓶兑换汽水数,同时也是当下对应的空瓶数

   totalemptybottle=drinknum+n%2     #空瓶总数

   

    if totalemptybottle<2:             #基础条件

        return drinknum

   

return drinknum+bottlechange(totalemptybottle)                           

 

def buy(money):

    num =money+bottlechange(money)         #递归空瓶可以兑换的汽水瓶数,初始空瓶数为money

    return num

def bottlechange(n):

    if n<2:             #基础条件

        return 0

    drinknum=n//2                     #空瓶兑换汽水数,同时也是当下对应的空瓶数

   totalemptybottle=drinknum+n%2     #空瓶总数

   

    returndrinknum+bottlechange(totalemptybottle)

用空瓶个数作为参数进行递归时,当空瓶小于2个的时候,就应该停止迭代了,直接返回此时的兑换数。

测试用例

>>> buy(15)

29

>>> buy(2)

3

>>> buy(1)

1

再比如买汽水的规则,1块钱可以买1瓶汽水,2个空瓶可以换一瓶汽水,3个瓶盖可以换一瓶汽水,问:20块可以买到多少瓶汽水?

分析:该问题的一个求解过程实际上就是用空瓶和瓶盖不断去兑换汽水的过程。这个过程有明显的递归性,可以使用递归的方法求解。它的出口条件是空瓶总数小于2且瓶盖总数小于3,因为这个条件下是无法兑换汽水的。

def bottlecapchange(bottle=0,cap=0):

    drinknum=bottle // 2+cap // 3 #空瓶和瓶盖兑换汽水瓶数

   totalemptybottle=drinknum+bottle % 2     #空瓶总数

    totalcap=drinknum+cap % 3              #瓶盖总数

   

    if totalemptybottle < 2 andtotalcap <3 :

        return drinknum

    else:

        return drinknum+bottlecapchange(bottle=totalemptybottle,cap=totalcap)

       

def buy(money):

    num =money+bottlecapchange(money,money)  #递归空瓶、瓶盖可以兑换的汽水瓶数

    return num

每次迭代过程中需要先算出当前可用的瓶盖和空瓶数。

测试用例

>>> buy(2)

5

>>> buy(1)

1

相关文章

  • 递归使用-换汽水问题

    假如有这么一个问题,1瓶汽水1块钱,2个空瓶可以兑换一瓶汽水,问n块钱可以兑换多少瓶汽水? 考虑整个过程就是用空瓶...

  • 汽水瓶换汽水 算法解析

    汽水瓶换汽水 算法解析1元买2瓶汽水,2个汽水瓶换1瓶汽水,问5元总共能得多少瓶汽水 循环算法 累计汽水数:15 ...

  • 考一考(三)

    智力题5(喝汽水问题) 1元钱一瓶汽水,喝完后两个空瓶换一瓶汽水,问:你有20元钱,最多可以喝到几瓶汽水? 智力题...

  • 函数式编程思想

    换硬币问题 问题就是动态规划里面的换硬币问题。所以函数式编程的关键和动态规划问题一样:递归关系式。换硬币问题发现他...

  • 【华为机试】汽水瓶

    题目描述某商店规定:三个空汽水瓶可以换一瓶汽水。小张手上有十个空汽水瓶,她最多可以换多少瓶汽水喝?答案是5瓶,方法...

  • 数据结构-递归

    递归定义:递归(Recursion)是指在函数的定义中使用函数自身的方法 递归使用的3个条件: 1.问题可以拆解成...

  • 华为笔试

    题目一 有这样一道智力题:“某商店规定:三个空汽水瓶可以换一瓶汽水。小张手上有十个空汽水瓶,她最多可以换多少瓶汽水...

  • Python yield

    参考:Python yield 使用浅析 - IBM 递归中使用yield 有时候yield就可以解决递归的问题,...

  • JAVA编程基础之递归结构

    递归结构 递归是一种常见的解决问题的方法,即把问题逐渐简单化。 递归的基本思想就是 自己调用自己 ”,一个使用递归...

  • C语言-使用递归的方法求n!

    问题描述:使用递归的方法求n! 源代码: 运行结果: 程序心得: 递归函数编程时,要抓住递归方法的两个方法:递归出...

网友评论

      本文标题:递归使用-换汽水问题

      本文链接:https://www.haomeiwen.com/subject/koowvctx.html