/*被static所修饰的在方法区
如果有生成对象,就在堆里
如果在方法里面,就在栈上
class Base{
public static int a = 10;//方法区
public static final int A = 20;//方法区
public int b = 30;//如果有生成对象==》堆
public final int C = 40;//堆
public static void fun() {
int a = 10;//栈
final int b = 20;//栈
}
}
递归
- 递归过程是指函数调用自身的过程
- 函数过程每次调用它自身时,都会占用更多的内存空间以保存其局部变量的附加副本
- 趋近于某个临界值 ,要有一个可以终止此递归的条件
- 如果栈溢出,会导致StackOverflowError错误
优点
代码更简洁清晰,代码量少
缺点
1.递归由于是函数调用自身,而函数调用是有时间和空间的消耗的:每一次函数调用,都需要在内存栈中分配空间以保存参数、返回地址以及临时变量,而往栈中压入数据和弹出数据都需要时间。->效率
2.递归中很多计算都是重复的,由于其本质是把一个问题分解成两个或者多个小问题,多个小问题存在相互重叠的部分,则存在重复计算,如fibonacci斐波那契数列的递归实现。->效率
3.调用栈可能会溢出,其实每一次函数调用会在内存栈中分配空间,而每个进程的栈的容量是有限的,当调用的层次太多时,就会超出栈的容量,从而导致栈溢出。->性能
阶乘
public static int fac(int n) {
int num = 1;
if(n == 1){
num = 1;
}else{
num = fac(n-1)*n;
}
return num;
}
斐波那契数列
public static int fibonaci(int n){
int f = 1;
if (n == 1 || n == 2){
return 1;
}else{
return fibonaci(n-1)+fibonaci(n-2);
}
}
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
int n = input.nextInt();
for(int i = 1;i<=n;i++){
System.out.print(fibonaci(i)+" ");
}
}
二分查找
public static int binarySearch(int[] array,int key,int high,int low){
low = 0;
high = array.length-1;
if (low>high) {
return -1;
}else {
int mid = (low + high) / 2;
if (key == array[mid]) {
return mid;
} else if (key < array[mid]) {
return binarySearch(array, key, mid - 1, low);
} else {
return binarySearch(array, key, high, mid + 1);
}
}
}
public static void main(String[] args) {
System.out.println("请输入你要查找的数字");
Scanner input = new Scanner(System.in);
int n = input.nextInt();
int[] array = {1,2,3,4,5,6};
System.out.println(binarySearch(array,n,0,array.length-1));
}
汉诺塔
public static void move(char pos1,char pos2) {
System.out.print(pos1+"==>"+pos2 + " ");
}
public static void hanio(int n,char pos1,char pos2,char pos3) {
if(n == 1) {
move(pos1,pos3);
} else {
hanio(n-1,pos1,pos3,pos2);
move(pos1,pos3);
hanio(n-1,pos2,pos1,pos3);
}
}
public static void main(String[] args) {
hanio(1,'A','B','C');
System.out.println();
hanio(2,'A','B','C');
System.out.println();
hanio(3,'A','B','C');
}