面试题:斐波那契数列
2018-01-24 20:40
204 查看
写一个函数,输入n,求斐波那契(Fibonacci)数列的第n项。斐波那契数列的定义如下:
f(n)=f(n-1)+f(n-2)
f(0)=0
f(1)=1
思路:教科书上演示递归的方法并不好,因为递归要从上至下到底后再反弹,要空间存储,费时又费力。说明递归方法不好的最好途径就是画树,一目了然,因为使用递归,出现了太多重复计算,而且因此还需占用大量空间。当n=100,递归就明显能感觉到很慢了。所以使用递推明显更好,也是根据定义,由f(n-2)和f(n-1)的和得到f(n)。这样,每个f(n)就只计算一次,即时间复杂度是O(n)。
代码如下:
static long Fibonacci(int n)
{
if (n < 0)
return -1;
int[] result = { 0, 1 };
if (n < 2)
return result
;
long fibNMinusOne = 1;
long fibNMinusTwo = 0;
long fibN = 0;
for (int i = 2; i <= n; i++)
{
fibN = fibNMinusOne + fibNMinusTwo;
fibNMinusTwo = fibNMinusOne;
fibNMinusOne = fibN;
}
return fibN;
}
心得:斐波那契数列数列有很多应用,常见的《兔子繁殖》《青蛙跳台阶》,核心就是这个n规模的问题与n-1和n-2规模的问题有直接的联系。因为递归要从上至下又会弹,所以一般递归的都很烧时间,而且还要不小的辅助空间,改良的方法就是从下到上,也就是递推去改良不必要的计算。
f(n)=f(n-1)+f(n-2)
f(0)=0
f(1)=1
思路:教科书上演示递归的方法并不好,因为递归要从上至下到底后再反弹,要空间存储,费时又费力。说明递归方法不好的最好途径就是画树,一目了然,因为使用递归,出现了太多重复计算,而且因此还需占用大量空间。当n=100,递归就明显能感觉到很慢了。所以使用递推明显更好,也是根据定义,由f(n-2)和f(n-1)的和得到f(n)。这样,每个f(n)就只计算一次,即时间复杂度是O(n)。
代码如下:
static long Fibonacci(int n)
{
if (n < 0)
return -1;
int[] result = { 0, 1 };
if (n < 2)
return result
;
long fibNMinusOne = 1;
long fibNMinusTwo = 0;
long fibN = 0;
for (int i = 2; i <= n; i++)
{
fibN = fibNMinusOne + fibNMinusTwo;
fibNMinusTwo = fibNMinusOne;
fibNMinusOne = fibN;
}
return fibN;
}
心得:斐波那契数列数列有很多应用,常见的《兔子繁殖》《青蛙跳台阶》,核心就是这个n规模的问题与n-1和n-2规模的问题有直接的联系。因为递归要从上至下又会弹,所以一般递归的都很烧时间,而且还要不小的辅助空间,改良的方法就是从下到上,也就是递推去改良不必要的计算。
相关文章推荐
- 《剑指offer》【面试题九:斐波那契数列】
- 【剑指offer】面试题10:斐波那契数列
- 《剑指Offer》学习笔记--面试题9:斐波那契数列
- 剑指offer 面试题9 斐波那契数列/青蛙跳台阶/矩形覆盖/变态跳台阶
- 面试题9:斐波那契数列
- 剑指offer-面试题9:斐波那契数列
- 剑指offer面试题 斐波那契数列
- 剑指offer-面试题 9 斐波那契数列
- 【面试题九】斐波那契数列
- 面试题9 斐波那契数列
- 面试题9:斐波那契数列
- 《剑指offer》面试题10:斐波那契数列(含矩阵乘法解法)
- 面试题9:斐波那契数列
- 九度剑指Offer面试题9:斐波那契数列(Java题解)
- 【面试题9】斐波那契数列
- 《剑指Offer》面试题九之斐波那契数列
- 剑指offer-面试题09-斐波那契数列
- 剑指offer 面试题9 斐波那契数列 java版答案
- 面试题9:斐波那契数列
- 剑指offer_面试题9_斐波那契数列