以下是一位大神分享的经验,在此分享给大家,希望对大家有帮助
首先是一道他碰到的一道点招面试题
/**
*
3.一个球从100米掉落下来,每次回弹 原来高度的 1/2 ,经过10次之后 求这个球总共经过的高度 (需要递归做)
第十次回弹多少?
* @author Kenny
*
* 思路:1,回弹的高度:
* 第一次: 50
* 第二次:25
* 第三次:12.5
* ....
* 第n次:100/2^n
* 2,这个球经过的距离
* 第一次: sum(1)=150;
* 第二次: sum(2)=sum(1) +75 ;
* 第三次: sum(3)=sum(2)+37.5;
* 第四次: sum(4)=sum(3)+18.75;
* ........
* 第n次: sum(n)=sum(n-1)+sum(1)/2^(n-1) ;
*/
public class CountHigh {
public static void main(String[] args) {
//定义一个方法求得第十次回弹的高度,用递归
int n = 10;
double high =getHigh(n);
System.out.println("第十次球回弹高度为:"+high+"米");
//递归求得这个球经过的总距离
double total =sum(n);
System.out.println("第十次球通过的总距离为:"+total+"米");
}
public static double getHigh(int n) {
double high= 100;
if (n==1) {
return high/2;//递归跳出条件
}else{
return high/(Math.pow(2,n));//否则就递归调用
}
}
public static double sum(int n) {
double sum1 = 150;
if (n==1) {
return sum1;//递归跳出条件
}else{
//sum(n)= sum(n-1)+sum(1)/2^(n-1) ;
//即 return sum(n-1)+sum(1)/2^(n-1) ,要转化为代码形式,Math.pow(2,n-1)就是 2^(n-1),转化为代码后:
//即return sum(n-1)+sum(1)/(Math.pow(2,n-1))
return sum(n-1)+sum(1)/(Math.pow(2,n-1));//否则就递归调用
}
}
}
对于递归算法题目的一般思考步骤如下
其实递归理解了也挺简单,为什么说简单,因为你只要找到规律,那么代码就出来了(下面会以一个例子说明),递归的基本思路就是:1,递归要有跳出条件,不然就成死递归会内存溢出(现在你只要简单记住就好,一般都是if(n==1){return语句}),为什么是n==1,因为通常我们做的题都是从n=1开始的,2,递归的规律,也就是核心代码,像找规律也挺简单的,你只要列举几个数值出来,看数值变化的规律就可以找到规律了,例如这题 2,这个球经过的总距离
* 第一次: sum(1)=150;
* 第二次: sum(2)=sum(1) +75=sum(1) +sum(1)/2 ;
* 第三次: sum(3)=sum(2)+37.5=sum(2) +sum(1)/4;
* 第四次: sum(4)=sum(3)+18.75=sum(3) +sum(1)/8;
* ........
* 第n次: sum(n)=sum(n-1)+sum(1)/2^(n-1) ;
最后得到通用表达式,sum(n)=sum(n-1)+sum(1)/2^(n-1) ;
所以所谓的找规律就是找通用表达式,而通用表达式就可以直接作为代码写到递归核心代码中,即
public static double sum(int n) {
double sum1 = 150;
if (n==1) {
return sum1;//递归跳出条件
}else{
//sum(n)= sum(n-1)+sum(1)/2^(n-1) ;
//即 return sum(n-1)+sum(1)/2^(n-1) ,要转化为代码形式,Math.pow(2,n-1)就是 2^(n-1),转化为代码后:
//即return sum(n-1)+sum(1)/(Math.pow(2,n-1))
return sum(n-1)+sum1/(Math.pow(2,n-1));//否则就递归调用
}
}
总结就两句话:1,定义递归跳出条件,2,找规律
|