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.主函数调用其他方法,若无其他方法,主函数出栈。程序结束。