1.
计算公式 mid=low/2 如果想要将性能优化到极致,那么
我们可以将公式里的除法运算改写成位运算:
mid=low » 1
因为相比除法 运算,计算机处理位运算的速度要快得多。
int a = 10/2;
//
int b = 10>>1;
// true
System.out.println(a==b);
System.out.println(a==b);
什么时候可以考虑用递归?
满足以下条件就可以使用递归
①重复的逻辑/计算
②有终止条件
应用:斐波那契额-卢卡斯数列,树的递归,有序数列的折半查找(二分查找)
代码:
/**
* 功能描述 :
*
* 斐波那契(fibonacciSequence)数列 1,1,2,3,5,8…,
*
* 下标: 0 ,1 ,2 ,3 ,4 ,5
* value:1 , 1 ,2 ,3 ,5 ,8
* 结论: 后面一个value是前面两个数的和 ,即
* f(n)= f(n-1)+f(n-2)
*
* 而 f(n-1)= f(n-2)+f(n-3)= f(0)
* @author guoyiguang
* @date 2023/1/7
* @param
* @return
*/
public int fibonacciSequence(int index){
// 前两个数(终止条件)
if(index == 0 || index==1){
return 1 ;
}
// 有点类似 分而治之的思想,最后将两个结果合并就是 要求的值(每一个 index 对应的value是这样算的,重复的逻辑)
return fibonacciSequence(index-1)+fibonacciSequence(index-2);
}
/**
* 功能描述 : 卢卡斯数列
* 1,3,4,7
* @author guoyiguang
* @date 2023/1/7
* @param
* @return
*/
public int lucasSequence(int index){
// index 为 0(终止条件)
if(index == 0){
return 1 ;
}
// index 为 1(终止条件)
if(index == 1){
return 3 ;
}
// 有点类似 分而治之的思想,最后将两个结果合并就是 要求的值(每一个 index 对应的value是这样算的,重复的逻辑)
return lucasSequence(index-1)+lucasSequence(index-2);
}