标签:ret 占用 ima array 数学 数量级 顺序 code 递归调用
Fibonacci array:1,1,2,3,5,8,13,21,34,...
在数学上,斐波那契数列是以递归的方法来定义:
用文字描述,就是斐波那契数列由0和1开始,之后的斐波那契系数就是由之前的两数之和想加而得,首几个斐波那契数列系数是:0,1,1,2,3,5,8,13,21,34,55,...特别指出:0不是第一项,而是第零项。
最容易想到的解法是按照公式的递归解法,具体实现如下:
int fib(int n) { if (n < 2) return n; return fib(n-1) + fib(n-2); }
但其实该递归解法会重复两次计算 fib(n-2) 项,时间数量级远远超过 n,是指数级别的增长,时间复杂度很高,如下图所示,更因递归调用占用大量的堆栈空间,对程序而言是一种灾难。所以该种解法如果在面试中肯定是不能让面试官满意的。
按照公式定义前开始的两项 a 和 b 为 0 和 1。后一项 c 是前两项之和,并且 a 和 b重新赋值,动态向右移动,时间复杂度为 O(n)。这种解法非常优秀!
int fib(int n) { if (n < 2) return n; int a = 0; int b = 1; int c = 0; for (int i = 1; i < n; ++i) { c = a + b; a = b; b = c; } return c; }
标签:ret 占用 ima array 数学 数量级 顺序 code 递归调用
原文地址:https://www.cnblogs.com/evenleee/p/11961234.html