/* 原問題 猴子分桃:海灘上有一堆桃子,有五隻猴子來分。
第一隻猴子把這堆桃子平分為五份,多了一個,這隻猴子把多的一個扔入海中,拿走了一份。
第二隻猴子把剩下的桃子又平分成五份,又多了一個,它同樣把多的一個扔入海中,拿走了一份,
第三、第四、第五隻猴子都是這樣做的,
問:
海灘上原來最少有多少個桃子
拓展問題 猴子分桃:海灘上有一堆桃子,有N只猴子來分。
第一隻猴子把這堆桃子平分為N份,多了K個,這隻猴子把多的一個扔入海中,拿走了一份。
第二隻猴子把剩下的桃子又平分成N份,又多了K個,它同樣把多的K個扔入海中,拿走了一份,
一直到最後一隻猴子也是這麼做
問:
海灘上原來最少有多少個桃子 第一個傳統問題首先最後剩下最小應該是6個,以6為最開始的基地進行逆序遞迴求出最小桃子數當不滿足條件的時候直接讓桃子數加5 拓展問題解決方案剩下最小應該是N+K個,以此進行逆序遞迴求最小桃子數當不滿足條件的時候直接讓桃子數加N
*/
public static class Get{
//傳統猴子分桃
public static int get(int times ,int sum ,int lastSum){
//0則返回
if (times == 0) {
return sum;
}else if (times == 5) {
//重新開始計算判斷是否要重設資料
if ((sum-1)%5==0&&sum>=6) {
return get(times-1, sum, (sum-1)/5*4);
}else {
return get(5, 6, 0);
}
}else {
//計算是否滿足這一次分桃
if ((lastSum-1)%5==0&&lastSum>6) {
return get(times-1, sum, (lastSum-1)/5*4);
}else return get(5,sum+5,0);
}
}
//自訂猴子分桃包括猴子數量以及每一次遺留下相同的桃子數量
public static int get(int monkeys,int loseSimpleNum){
int minNum = monkeys+loseSimpleNum;
return getDiy(monkeys, minNum, 0, loseSimpleNum, monkeys);
}
public static int getDiy(int times ,int sum ,int lastNum,int loseSimpleNum,int monkeys) {
int minNum = monkeys+loseSimpleNum;
int nextmonkeys = monkeys-1;
/* System.out.println(times+"sum:"+sum+"\nlastNum:"+lastNum);*/
//0則返回
if (times == 0) {
return sum;
}else if (times == monkeys) {
//重新開始計算判斷是否要重設資料
if ((sum-loseSimpleNum)%monkeys==0&&sum>=minNum) {
//System.out.println("replare");
return getDiy(times-1, sum, (sum-loseSimpleNum)/monkeys*nextmonkeys,loseSimpleNum,monkeys);
}else {
//System.out.println("replare222");
return getDiy(times, minNum, 0,loseSimpleNum,monkeys);
}
}else {
//計算是否滿足這一次分桃
if ((lastNum-loseSimpleNum)%monkeys==0&&lastNum>minNum) {
//System.out.println("nest");
return getDiy(times-1, sum, (lastNum-loseSimpleNum)/monkeys*nextmonkeys,loseSimpleNum,monkeys);
}else return getDiy(monkeys, sum+monkeys, 0,loseSimpleNum,monkeys);
}
}
}