递归算法和变量类型的详细分析

一:递归算法

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);
}
}

方法的传参方式:值传递和引用传递(址传递)

欢迎大家一起讨论学习!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值