一:递归算法
1.1递归的形式和特点
算法:为了解决某些特定类新的问题,经过长期的探索,所总结出来的一套行之有效的解决方案
递归的形式:
直接递归:方法自己调用自己
间接递归:方法调用其他方法,其他方法又回调方法本
方法递归存在的问题(注意事项)?
递归如果没有控制好终止条件,会出现递归的死循环,导致栈内存溢出的现象
如下显示:
public class Recursivealgorithm {
public static void main(String[] args) {
test2();
}
public static void test(){
System.out.println("---------test方法执行---------");
test();//方法递归 直接递归形式
}
public static void test2(){//方法递归 间接递归
System.out.println("--------test2方法执行----------");
test3();
}
private static void test3() {
System.out.println("---------test3方法执行---------");
test2();
}
}
2.2递归算法的流程和核心要素
案例①:计算1~n的阶乘
分析 例:5!=5*4*3*2*1
f(n)=1*2*3...(n-1)*n;等价于f(n)=f(n-1)*n
f(5)=f(4)*5 f(4)=f(3)*4 f(3)=f(2)*3 f(2)=f(1)*2 f(1)=1
递归算法的要素:
递归公式:f(n)=f(n-1)*n;
递归的终点:f(1)=1;
递归的方向必须走向终点;
public class RecursionDemo1 {
public static void main(String[] args) {
int res=f(5);
System.out.println(res);
}
/*递归公式: f(n) = f(n-1) *n
递归的终点: f(1) = 1*/
public static int f(int n){
if(n==1){
return 1;
}else{
return f(n-1)*n;
}
}
}
案例②:计算1~n的和;
分析:
递归算法的要素:
递归公式:f(n)=f(n-1)+n;
递归的终点:f(1)=1
递归的方向必须走向终点;
public class RecursionDemo2 {
public static void main(String[] args) {
int res=f(5);
System.out.println(res);
}
public static int f(int n){
if(n ==1 ){
return 1;
}else{
return f(n-1)+n;
}
}
}
案例③:
猴子第一天摘了若干桃,当即吃了一半,觉得不过瘾,于是又多吃了一个
第二天 又出了前天剩余桃子的一半,觉得不过瘾,于是又多吃了一个
以后每天都是吃前天剩余桃子的一半,觉得不过瘾,于是又多吃了一个
等到第10天 的时候,返现桃子只有1个
请问猴子第一天摘了多少桃子?
分析:
递归算法的要素:
递归公式:f(x)-f(x)/2-1=f(x+1)~(通分)2f(x)-f(x)-2=2f(x+1)~f(x)=2f(x+1)+2
递归的终点:f(10)=1
递归的方向必须走向终点;
求f(1)=?
public class RecursionDemo3 {
public static void main(String[] args) {
System.out.println(f(1));
}
//猴子吃桃问题
public static int f(int x) {
if (x == 10) {
return 1;
}else{
//公式:f(x)=2f(x+1)+2
return 2*f(x+1)+2;
}
}
}
二.变量的类型
2.1基本变量
红框分析:把a的值赋给temp,temp=10,把b的值赋给a,a=20,把temp赋给b,b=10.
2.2引用类型
在Java中 凡是通过关键字new 创建出来的对象都在堆区 堆区是垃圾回收器重点回收区域
int[] arr = new int[5];
存的是地址 final地址不能发生变化但是所修饰的对象属性可以被修改。如下面例子:
public class Test {
public static void main(String[] args) {
Student stu1 = new Student("tom" ,20);
Student stu2 = stu1;
stu2.setAge(22);
System.out.println(stu1.getAge());
final Student stu3 = new Student("jack",21);
// stu3 = stu2;//不能把地址改变
stu3.setAge(18);//可以改变对象的属性
System.out.println(stu3);
}
}
方法的传参方式:值传递和引用传递(址传递)
欢迎大家一起讨论学习!