前言
今天看到群里有个小伙伴发了一个问题,我挺感兴趣的,一元钱一瓶汽水,喝完后两个空瓶能换一瓶汽水,问:你有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));
总结
小子能力有限,只能做到这里,还望大佬不吝赐教,让小子多学习一点,万分感谢!!!原创不易,转载请标名出处