一。
函数就是定义在类中的具有特定功能的一段独立的小程序。
函数也称方法。为了提高代码的复用性,可以将其定义成一个单独的功能,该功能体现就是java中的函数
定义格式:修饰符 返回值类型 函数名 (参数类型 形参1,参数类型 形参2){
执行语句;
return返回值;
}
1.返回值类型 :是函数运行后的结果的数据类型
2.参数类型:形参的数据类型
3.实参:传递给形参的具体数值
4.return:结束函数
5.返回值:该函数运算后的结果,该结果会返回给调用者。
6.访问权限:public private protected 函数的使用范围
1.当函数没有具体返回值时,用void关键字表示,是不可以写具体返回数据类型
return语句可以省略不写,但是系统会自动加上(还是存在的)。
2.函数的作用:用于定义功能(方法)
用于封装代码提高代码的复用性
1.实际参数:在调用函数的时候,给函数传递的数据(常量,变量)叫做实参。
2.形式参数:定义函数的时候,参数列表当中的数据,叫做形参。
实参是将 常量在常量池中的地址 对象在堆内存中的地址传递给了形参
1.重载的定义:在一个类中,出现同名的方法 访问修饰符相同 返回类型相同 参数列表不同
重载的适用场景:就是根据现有的不同参数,为了要完成同样的功能时,可以用重载,重载的过程中可以去使用不同的业务逻辑
函数练习:
本身时素数 反转后也是素数 不是回文
class Demo04_07{
public static void main(String[] args){
int count=0;
int num=2;
while(true){
if(isFanZhuanSuShu(num)){
count++;
System.out.print(num+" ");
if(count%10==0){
System.out.println();
}
}
if(count==100){
return; //结束当前函数
}
num++;
}
}
public static boolean isFanZhuanSuShu(int num){
return isSuShu(num)&&isSuShu(reverse(num))&&!isHuiWen(num);
}
//回文功能
public static boolean isHuiWen(int num){
return reverse(num)==num;
}
//素数功能
public static boolean isSuShu(int num){
for(int i=2;i<=num/2;i++){
if(num%i==0){
return false;
}
}
return true;
}
//反转功能
public static int reverse(int num){
int sum=0;
while(true){
sum=sum*10+num%10;
num/=10;
if(num==0){
return sum;
}
}
}
}
二。内存
栈空间: 运行速度很快 用于存储基本数据类型的局部变量和引用数据类型的引用,对象本身不存放在栈中,栈空间的变量需要一个声明周期,存储内容的灵活性不强
堆空间:存放所有new出来的对象,成员变量 常量等 里面存放的内容不需要生命周期,存储内容更灵活。
1.当前正在执行的函数所对应的帧就是当前的帧(位于栈顶),它保存当前函数的局部变量、中间运算结果等数据
2.当函数返回时,栈帧从java栈中被弹出。有两种返回函数的方式,一种是正常的函数返回,使用return,另一种是抛出异常。
其实非常好理解,我们可以将栈看成是一个箱子:
1.往箱子里面放东西叫做入栈
2.往箱子里面取东西叫做出栈
3.所以一定时先进后出从箱子里拿东西不可能先把下边的拿出来上边的不动吧。
三。递归
人用迭代 神用递归
递归:方法自身调用自身
先递,后归。我们可以将递归分成三个部分:
前进段:问题从大化小
结束段:问题无法再继续化小,则处理当前
返回段:将小问题处理完后,向上返回(有些问题是不需要返回的)
斐波那契的两种方法
public class Feibo {
public static void main(String[] args) {
System.out.println(fab_recursion(10));
System.out.println(fab_iteration(10));
}
//迭代实现斐波那契
private static long fab_iteration(int index) {
if (index ==1 || index == 2) {
return 1;
}
else {
long f1 = 1l;
long f2 = 1l;
long f3 = 0;
for ( int i = 0; i < index-2; i++) {
f3 = f1 + f2;//利用变量的原值推算出变量的一个新值
f1 = f2;
f2 = f3;
}
return f3;
}
}
//递归实现斐波那契
private static long fab_recursion(int index) {
if (index ==1 || index == 2) {
return 1;
}
else {
return fab_recursion(index-1) + fab_recursion(index - 2);//递归求值
}
}
}
递归就是函数进栈,进栈的次数多了,势必会占内存,无法避免的。再某些问题上,递归所写的代码要比迭代写的代码少,某些问题迭代写不出来所以要用递归。
分治法是一种算法思想,分治法主要解决的问题是将大问题进行拆分成若干个小问题进行求解,最终将小问题进行合并。