结果为149,我这里有两种方法。
第一种按照自己的理解去写的,容易理解,比较长。
第二种很短,是别人给我的,难以理解,但是又是对的。
如果你理解了第二种方法,可以交流一下。
方法一
/*
每 3 个可乐盖可兑换 1 瓶子可乐,求买 100 瓶可乐最终可获得的可乐瓶子数。(递归练习)
*/
public class RecursionDemo {
/*
瓶盖数 兑换数 剩余瓶盖数
100 > 33 1
34 > 11 1
12 > 4 0
4 > 1 1
2 > 0 2
最终瓶子数量=1+4+11+33+100=149
用递归可以计算兑换获得的瓶子数量
然后加上起始瓶子数量
*/
/**
* 每 3 个瓶盖可兑换 1 瓶可乐
* 你买了多少瓶可乐呢,我可以帮你计算最终你可以喝到多少瓶可乐
* @param bottles 你买的可乐瓶数
* @return 你最终兑换得到的可乐瓶数
*/
public static int countBottles(int bottles) {
// 把这bottles瓶可乐喝了,可以获得bottles个瓶盖
int lids = bottles;
// 最终你能喝到的瓶数=刚刚喝掉的瓶数+用这些瓶盖最终能换来的瓶数
return bottles + getCola(lids);
}
/**
* 递归
* 每三个瓶盖可以换一瓶饮料
* @param lids 给多少个瓶盖
* @return 返回值是你给的瓶盖所能换来的所有饮料瓶数
*/
public static int getCola(int lids) {
// 现在有lids个盖子
// 判断瓶盖是否少于三个
if (lids < 3) {
// 瓶盖少于三个,不能兑换了
return 0;
} else {
// 还能兑换,用lids个瓶盖兑换,那么可以换来lids/3瓶新可乐,剩下lids%3个瓶盖
// 兑换可乐之后,旧的瓶盖数量
int oldLids = lids % 3;
// 兑换可乐之后,新可乐数量
int newBottles = lids / 3;
// 喝了新的可乐,新瓶盖数量
int newLids = newBottles;
// 当前瓶盖数量=旧的瓶盖数量+新的瓶盖数量
lids = oldLids + newLids;
// 能换来的总数量=这次兑换得到的新瓶子数量+当前瓶盖数量可以换来的瓶子数量
int res = newBottles + getCola(lids);
return res;
}
}
public static void main(String[] args) {
System.out.println(countBottles(100));
}
}
方法二
public class ColaDemo {
public static void main(String[] args) {
System.out.println(cola(100));
}
public static int cola(int num) {
if (num < 3) {
return num;
}
int i = num / 3;
int j = num % 3;
return num - j + cola(i + j);
}
}