題目:
小明去超市買5瓶啤酒,喝完後,一個瓶子可以分成一個瓶蓋和瓶子,四個瓶蓋可以換一瓶新酒,兩個瓶子可以換一瓶新酒,那麼小明買5瓶酒最後一共可以喝多少瓶啤酒?
答案
/**
* 問題描述:小明去超市買5瓶啤酒,喝完後,一個瓶子可以分成一個瓶蓋和瓶子,
* 四個瓶蓋可以換一瓶新酒,兩個瓶子可以換一瓶新酒,那麼小明買5瓶酒最後一共可以喝多少瓶啤酒?
*/
/**
* 計算能喝的啤酒總瓶數
* @param {*} buyBeerCount 購買的啤酒數量
*/
var calcTotalDrinkBeerCount = function (buyBeerCount) {
/** 記錄喝過的總啤酒數 */
var totalBeerCount = 0;
/** 蓋子兌換率,4個蓋子換一瓶酒 */
var capRate = 4;
/** 瓶子兌換率,2個瓶子換一瓶酒 */
var bottleRate = 2;
/**
* 根據現有啤酒數量,現有瓶蓋數量,現有瓶子數量計算可以兌換的新的啤酒數
* @param {*} beerCount 現有啤酒數量
* @param {*} capCount 現有瓶蓋數量
* @param {*} bottleCount 現有瓶子數量
* @returns
*/
var calcExchangeBeer = function (beerCount, capCount, bottleCount) {
/**
* 退出遞歸條件:
* 1. 啤酒數量爲 0
* 2. 瓶蓋數量不夠兌換啤酒
* 3. 瓶子數量不夠兌換啤酒
*/
if (beerCount === 0 && capCount < capRate && bottleCount < bottleRate) {
console.log("不夠兌換,計算結束");
return;
}
// 如果有整瓶啤酒,則把整瓶啤酒轉換爲瓶子和啤酒蓋,並記錄到喝過的總數
if (beerCount > 0) {
// 記錄總數
totalBeerCount += beerCount;
capCount += beerCount;
bottleCount += beerCount;
// 啤酒喝了,清空
beerCount = 0;
}
console.log("把【啤酒】轉換爲【瓶子】和【啤酒蓋】:");
console.log(
"已喝啤酒數:" +
totalBeerCount +
",啤酒數:" +
beerCount +
",蓋子數:" +
capCount +
",空瓶子數:" +
bottleCount
);
// 把能轉換的蓋子轉換爲啤酒
if (capCount >= capRate) {
beerCount += Math.floor(capCount / capRate);
// 剩餘瓶蓋數
capCount = capCount % capRate;
}
// 把能轉換的瓶子轉換爲啤酒
if (bottleCount >= bottleRate) {
beerCount += Math.floor(bottleCount / bottleRate);
bottleCount = bottleCount % bottleRate;
}
console.log("把【瓶子】和【啤酒蓋】轉換爲【啤酒】:");
console.log(
"已喝啤酒數:" +
totalBeerCount +
",啤酒數:" +
beerCount +
",蓋子數:" +
capCount +
",空瓶子數:" +
bottleCount
);
calcExchangeBeer(beerCount, capCount, bottleCount);
};
console.log("初始值:");
console.log("啤酒數:" + buyBeerCount + ",蓋子數:" + 0 + ",空瓶子數:" + 0);
calcExchangeBeer(buyBeerCount, 0, 0);
console.log("總共可以喝【" + totalBeerCount + "】瓶啤酒");
};
calcTotalDrinkBeerCount(5);