一元钱一瓶汽水,喝完后两个空瓶能换一瓶汽水,问:你有20元钱,可以喝到几瓶汽水?

前言

今天看到群里有个小伙伴发了一个问题,我挺感兴趣的,一元钱一瓶汽水,喝完后两个空瓶能换一瓶汽水,问:你有20元钱,可以喝到几瓶汽水?


我就纳闷了,这个人是谁啊,这么能喝,按照一瓶500ml,这哥们得喝几十瓶,少说也得喝一桶桶装水吧,反正我是一时半会喝不下这么多,但是这并不妨碍我这个小脑袋来想这个问题。


建议大家先思考,在来看代码。


以下内容都是 明明有话说 的个人想法,与 明明有话说 本人无关


流程图

先说好,不准打脸。就算是我画太丑了,画错了,也不准打脸

在这里插入图片描述

高清流程图链接

代码

/**
 * 假设 一元钱一瓶汽水,喝完后两个空瓶能换一瓶汽水,问:你有20元钱,可以喝到几瓶汽水?
 * @param {*} money 总资金
 * @param {*} price 单瓶价格
 * @param {*} boon 几个空瓶子能换一瓶水
 * @returns { result: [ 20, 10, 5, 2, 1, 1 ], count: 39 }
 */
function count(money, price = 1, boon = 2) {
  // 一次买20瓶 => 20
  // 20 => 10
  // 10 => 5
  // 5 => 2 .. 1
  // 2 => 1
  // 1+1 => 1

  if (boon <= 1) {
    throw new Error('不能用' + boon + '换一个瓶子');
  }

  // 剩下的空瓶
  const emptyBottle = money / price;
  // 结果
  const result = [emptyBottle];
  // 计算中的余数(空瓶)
  let remainders = [];

  /**
   * 核心 - 计算空瓶数量(递归)
   * @param {*} num 水瓶数量
   * @param {*} flag 清空剩余空瓶的开关
   * @returns
   */
  function fun(num, flag = false) {
    // 当兑换的数量小于最低的额度时,停止递归
    if (num < boon) {
      // 判断结余的空瓶,再次计算
      if (remainders.length > 0) {
        const count = remainders.reduce((perVal, curVal) => perVal + curVal);
        // 继续下一次递归
        fun(count, true);
      }
      return;
    }

    // 计算兑换的水瓶数量
    const waterBottle = num / boon;
    if (waterBottle % boon === 0) {
      // 兑换的空瓶数量刚刚刚好,不会有剩余
      result.push(waterBottle);
      // 继续下一次递归
      fun(waterBottle);
    } else if (waterBottle % boon > 0) {
      // 兑换的空瓶后,有剩余不足以兑换新的水瓶
      const _temp = waterBottle % 2;
      result.push(Math.floor(waterBottle));
      // 如果开始计算剩余空瓶数量,重置数组
      flag ? (remainders = []) : remainders.push(_temp);
      // 继续下一次递归
      fun(waterBottle - _temp);
    }
  }

  fun(emptyBottle);

  return {
    result,
    count: result.reduce((perVal, curVal) => perVal + curVal),
  };
}

// { result: [ 20, 10, 5, 2, 1, 1 ], count: 39 }
console.log(count(20));



总结

小子能力有限,只能做到这里,还望大佬不吝赐教,让小子多学习一点,万分感谢!!!

原创不易,转载请标名出处

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值