猴子吃桃问题:猴子第一天摘下若干个桃子,当即吃了一半,还不过瘾,
又多吃了一个,第二天早上又将剩下的桃子吃掉一半,又多吃了一个。
以后每天早上都吃了前一天剩下的一半零一个。到第10天早上想再吃时,
见只剩下一个桃子了。求第一天共摘了多少。
public int ChiTao( int d) {
//第十天只有一个桃子
if(d == 1) {
return 1;
}
//每天都吃了前一天剩的一半零一个
return (ChiTao(d-1)+1)*2;
}
public static void main(String[] args) {
Test t = new Test();
System.out.println(t.ChiTao(10));
}
森林里有一只熊怪,很爱吃核桃。不过它有个习惯,每次都把找到的核桃分成相等的两份,
吃掉一份,留一份。如果不能等分,熊怪就会扔掉一个核桃再分。第二天再继续这个过程,
直到最后剩一个核桃了,直接丢掉。
有一天,熊怪发现了1543个核桃,请问,它在吃这些核桃的过程中,一共要丢掉多少个核桃。
int hetao = 0;
public int HeTao(int ht) {
//递归的出口,熊怪只有一个核桃了
if(ht == 1) {
return 1;
}
//核桃可以等分的情况下
if(ht % 2 == 0) {
HeTao(ht /2);
}else {
//核桃不能等分时,扔掉一个核桃再分
hetao++;
HeTao((ht/2)-1);
}
return hetao;
}
public static void main(String[] args) {
Test5 t = new Test5();
System.out.println(t.HeTao(1543));
}
在用递归的时候要注意顺序吃一个再等分,在写式子的时候要先除再减,因为用递归算的时候是回溯,所以顺序要颠倒,答案才能正确。
一根高筋拉面,中间切一刀,可以得到2根面条。
如果先对折1次,中间切一刀,可以得到3根面条。
如果连续对折2次,中间切一刀,可以得到5根面条。
那么,连续对折10次,中间切一刀,会得到多少面条呢?
int miantiao = 2;
public int MianTiao(int dao) {
if(dao == 0) {
return 2;
}
miantiao = miantiao * 2 - 1;
MianTiao(dao - 1);
return miantiao;
}
public static void main(String[] args) {
Test6 t= new Test6();
System.out.println(t.MianTiao(10));
}