方法与对递归的理解

本文探讨了Java中的递归调用原理,包括每一级递归有自己的变量、逐级返回、相同执行顺序及反向执行顺序等特点。还介绍了方法调用的栈结构以及Java内存的堆栈区、方法区、本地方法区和寄存器的分工。同时,讲解了垃圾回收机制对堆区数据的释放。
摘要由CSDN通过智能技术生成

import java.util.Scanner;

public class Demo8 {
    public static void main(String[] args) {
        Scanner ip = new Scanner(System.in);
        System.out.println("请输入斐波拉契列的长度");
        int n=ip.nextInt();
        long []num=new long[n];
        for(int i=1;i<=n;i++){
            num[i-1]=topic06(i);
            System.out.printf("%5d",num[i-1]);
        }
    }


    public static long topic06(int n){
        if(n==1||n==2){
            return 1;
        }
        else {
            return topic06(n-1)+topic06(n-2);
        }
    }
}

通过上述例子我们可以看到:

第一:每一级的函数调用都有它自己的变量。

第二:每一次函数调用都会有一次返回,并且是某一级递归返回到调用它的那一级,而不是直接返回到main()函数中的初始调用部分。

第三:递归函数中,位于递归调用前的语句和各级被调函数具有相同的执行顺序。例如在上面的程序中,打印语句位于递归调用语句之后,它按照递归调用的顺序被执行了n次,即依次为第一级、第二级、第三级、第四级...第n级。

第四:递归函数中,位于递归调用后的语句的执行顺序和各个被调函数的顺序相反。其执行顺序依次是:第n级..第四级、第三级、第二级、第一级。

第五:虽然每一级递归都有自己的变量,但是函数代码不会复制。

第六:递归函数中必须包含终止递归的语句。通常递归函数会使用一个if条件语句或其他类似语句一边当函数参数达到某个特定值时结束递归调用,如上面程序的if(n == 1||n==2)。

特殊说明

所以说递归调用的每一次调用都是在方法内部调用,没有返回主函数。当递归调用遇到递归边界后,会从边界开始执行每个语句,知道语句结束才会返回主函数。

方法 的使用

每次执行方法,是通过栈结构实现的。即先进后出:

每次执行.class 文件,

1.虚拟机先调用主函数即主函数入栈,

2.通过主函数去调用其他方法(其他方法入栈),如果是含参数的方法,此时也将实参赋值给形参;

3.使用调用的方法,方法结束完后,如果该方法不是void类型,会将返回值返回到主函数。之后方法体结束(出栈)

4.主函数调用其他方法,若无其他方法,主函数出栈。程序结束。

java的内存分区

1.java 将内存分成了 5 块儿 , 分别是堆区 , 栈区 , 方法区 , 本地方法区 , 寄存器
        栈区: 里面存放数据的特点是 : 先进后出 , 我们主要将加载时的局部变量和函数放在栈区 , 数据
                的特点是使用完立刻释放
        堆区:存放的是实体 ( 对象和数组 ), 实体可以同时存放多个值 , 实体里面的变量如果不赋值 ,
                有默认值.整型数据默认值是 0,boolean---false
了解 :
        方法区: 程序运行中的二进制文件等 ( 比如 :.class)
        本地方法区: 存放外界引入的 c,c++ 等的内容
        寄存器: 也可以称为计数器 .
堆区中的数据会在某个时刻被释放- 通过垃圾回收机制 .
        垃圾回收机制是通过一个线程控制的, 由于这个线程的等级比较低 , 所以不会立刻执行 , 数据就
不会立刻释放
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值