斐波那契数列之递归
一、什么是斐波那契数列
斐波那契数列,又称黄金分割数列,指的是这样一个数列:0、1、1、2、3、5、8、13、21、……在数学上,斐波纳契数列以如下被以递归的方法定义:F0=0,F1=1,Fn=F(n-1)+F(n-2)(n>=2,n∈N*),斐波那契数列最初是为了计算兔子的出生数量而出现的,所以也叫“兔子数列”!
二、什么是递归
递归的本质其实程序的方法自身调用自身,在到达一个条件的时候停止调用(所以在用递归的时候一定要找好基准条件,否则就是一个列循环!)。
这是一个更正式的定义:
程序调用自身的编程技巧称为递归( recursion)。
一个过程或函数在其定义或说明中有直接或间接调用自身的一种方法,它通常把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解,递归策略只需少量的程序就可描述出解题过程所需要的多次重复计算,大大地减少了程序的代码量。递归的能力在于用有限的语句来定义对象的无限集合。一般来说,递归需要有边界条件、递归前进段和递归返回段。当边界条件不满足时,递归前进;当边界条件满足时,递归返回。
注意:
(1) 递归就是在过程或函数里调用自身;
(2) 在使用递归策略时,必须有一个明确的递归结束条件,称为递归出口。
三、对应代码的实现
有如题:用递归求第10个数,它等于前2数之和,如{1,1,2,3,5}
用递归的方法实现代码如下:
public class Test { /* 斐波那契数列: 0、1、1、2、3、5、8 可以这样理解 f0 = 0; f1 = 1; fn = f(n-1) + f(n - 2) (n >= 2) */ public static void main(String[] args) { System.out.println(f(5)); } public static int f(int n) { if (n == 1 || n == 2) { return 1; } else { return f(n - 1) + f(n - 2); } } }
这个程序很简单,自己仔细想想就可以明白了!
非递归方法实现代码:
public class Fab { /* 斐波那契数列,用循环的方式来写 */ public static void main(String[] args) { System.out.println(funt(5)); } public static int funt(int index) { if(index == 1 || index == 2) { return 1; } int f1 = 0; int f2 = 1; int res = 0 ; /*在这里因为第一位是写死的,所以会多算一次*/ for(int i=0; i<index -1 ;i++) { res = f1 + f2; f1 = f2; f2 = res; } return res; } }
注:所有递归都可以用相对应的循环代码来进行对应的功能实现!
三、应用场景
在系统中,构造树形结构(WBS模板树、具体项目的WBS树、项目群树、省市县树形结构等)时用到了递归算法。就结构简单的树形结构而言,对性能的影响并不明显,例如项目群树,它的属于一维的树形结构,且采用递归算法的递归深度小于3。但是,对于复杂的树形结构,采用递归算法实现时,响应速度普遍较慢,如WBS模板树、具体项目的WBS树以及省市县树形结构等,都是多维的,且递归深度不确定(至少大于3)。因此,在构造复杂的树性结构时需要把递归算法转换为非递归算法。除此之外,在其它复杂的递归算法中,也可以采用将递归算法转换为非递归算法的方法,以提高算法的性能。
注:性能方面:(这个是我在网上看的大多数人的经验来写的自己并没有实验),我用到的递归主要是用在建立树形菜单上面且深度没有超过3级所以性能没有很大的变化,网友说在构建树形菜单的时候超过3级以后特别是数据比较多,性能就会出现明显的低下!所以在性能出现低下的时候最好用对应的循环来实现最好!