在栈的学习中有一个非常著名的应用,那就是斐波那契数列的实现:
如果兔子在出生两个月后,就有繁殖能力,一对兔子一个月能生出一对小兔子。假设所有兔子都不死,那么一年后可以繁衍对少对兔子。
我们那新出生的一对小兔子分析:前两个月小兔子没有繁衍能力,所以还是一对;两个月后,生下一对小兔子,共两对;三个月后,老兔子又生下一对,因为小兔子还没有繁衍能力所以一共就三队…… 以此类推可以得到一年当中各月份的兔子对数如下:
1;1;2;3;5;8;13;21;34;55;89;144.
上面的数字构成了一个数列。这个数列有个十分明显的特点,那就是:前面相邻两项之和构成了后一项
如果我们用数学函数来定义,如下
Java代码实现:
package com.sfd.use;
public class Fibonacci {
public static void main(String[] args) {
System.out.println(function(0));
}
public static int function(int i){
if(i<=0) return 0;
//递归函数的出口:每一个递归定义必须至少有一个条件,满足时递归不
//在进行,既不在引用自身而是返回值退出
if(i==1||i==2)
return 1;
return function(i-1)+function(i-2);
}
}
递归和栈有什么关系:
我们都知道递归分为前进阶段和回退阶段(前进阶段:一层一层的调用函数的阶段;回退阶段:满足退出条件得到结果,一层一层返回运算的阶段)。递归过程回退顺序是前进顺序的逆序。在退回过程中,可能要执行某些动作,包括恢复在前行过程能中存储起来的某些数据。
这种存储某些数据,并在后面又以存储的逆序恢复这些数据,以提供之后使用的需求,显然很符合栈的数据结构,因此,编译器使用栈实现递归就没什么好惊讶的了。