递归与分治
递归是一个分治思想的具体实现,分治(divide and conquer)的全称称为“分而治之”,分治即是将大问题划分为若干个规模较小、可以直接解决的子问题,然后解决这些子问题,最后将这些子问题的解合并起来,即是原问题的解。
分治是一种思想,它不涉及到具体的算法,而大多数情况下,分治都是借由递归来实现的。。从c语言和java语言的角度来讲,递归就是这个函数或者方法反复调用自身,然后将问题一步步地缩小,直到这个问题已经缩小到可以直接解决的程度,然后再一步一步地返回,最终解决原问题。
猴子吃桃
有一只猴子捡了一堆桃子,它第一天吃了一半,觉得好吃,就又吃了一个;第二天吃了剩下的一半,觉得好好吃,就又又吃了一个;第三天同样吃了剩下的一半,还是觉得好好好吃,就又又又吃了一个;到第四天的时候就只剩下一个桃子了。问猴子捡了多少桃子?
算法思想
假设第一天时候有x个桃子,第二天为y,第三天为z,第四天的时候剩下一个;从最后一天开始逆推,最后一天的前一天共有z个,然后z/2+1个,因此最后一天用z表示就是z-(z/2+1),所以由z-(z/2+1)=1得出,z=2*(1+1);依此类推,第二天y=2*(z+1);第一天为x=2*(y+1);如图所示。
递归的基本要素
1.递归终止的条件
2.递归的操作
if( // 递归终止条件){
}
// 递归操作
代码实现
public class RecursionTest {
//猴子吃桃
public int eachPeach(int day){
// 递归终止的条件
if(day==1){
return 1;
}
//递归操作
return 2*(eachPeach(day-1)+1);
}
public static void main(String[] args) {
RecursionTest recursionTest = new RecursionTest();
Scanner scanner = new Scanner(System.in);
System.out.println("请输入天数");
int day = scanner.nextInt();
int count = recursionTest.eachPeach(day);
System.out.println(count);
}
}