斐波那契数列及其应用
斐波那契数列的定义为:

用代码实现斐波那契数列求f(n)时,通常认为有递归和循环两种实现方法。
其中递归实现代码如下:
1 public static long Fabonacci_recur(long n){ 2 if(n <= 0) 3 return 0; 4 if(n == 1) 5 return 1; 6 return Fabonacci_recur(n-1) + Fabonacci_recur(n-2); 7 }//Fabonacci_recur
但是递归实现虽然让代码简洁了,却存在着由于每次函数调用都需要保存参数,返回地址及临时变量,进出栈需要时间开销等操作,此外还存在重复计算的问题。因此递归调用的效率低下。
另外当数据量比较大时,由于递归的层级太多,还会导致调用栈溢出。
考虑到递归调用的诸多问题。实际在代码实现时很少会采用递归调用,更多的是循环调用:
1 public static long Fabonacci_cycle(long n){ 2 long[] result = {0,1}; 3 if(n < 2) 4 return result[(int) n]; 5 long fabZero = 0; 6 long fabOne = 1; 7 long fabN = 0; 8 for(int i = 2 ; i <= n ;i++){ 9 fabN = fabZero + fabOne ; 10 fabZero = fabOne ; 11 fabOne = fabN; 12 } 13 return fabN ; 14 }//Fabonacci_cycle
斐波那契数列的应用
问题:一只青蛙一次可以跳上1级台阶,也可以跳上2级。求青蛙跳上一个n级的台阶一共有多少种跳法。
【 遇到复杂问题可以考虑采用:(1) 画图--使抽象问题形象化 (2) 举例--使抽象问题具体化 (3)分解--使复杂问题简单化 】
这里先看几个特殊的例子:
当 n = 1 只有一种跳法 f(n) = 1
当 n = 2 有两种跳法 f(n) = 2
考虑一般情况 当 n = m (m>2) 时, 跳到n阶台阶前必先经过第n-1阶 和 第 n-2 阶 这两个台阶的任意一个,而跳到第n-1阶有f(n-1)种跳法,调到n-2阶有f(n-2)种跳法,因此跳到第n 阶有f(n-1) + f(n-2) 种跳法
显然 总的跳法数f(n) 是一个斐波那契数,但是该斐波那契数所在数列的前两项为1,2
即 1,2,3,5,8,13,21 ……
和 1,1,2,3,5, 8,13 …… 的斐波那契数列由有细微的差异 。
思考沉淀心智,写作使人准确
浙公网安备 33010602011771号