剑指Offer:斐波那契数列
2018-01-25 16:38
351 查看
写一个函数,输入n,求斐波那契数列的第n项。斐波那契数列的定义如下:
说起斐波那契数列对于广大程序员是无人不知呀!对于此问题的解法—–递归。更是深入人心。
递归的代码简洁明了,似乎这就是我们面试时候要写的代码。但是,递归的效率是特别低下的,这种解法舍去。
与递归一起对应的一种方法—–迭代。提及迭代我们要想到使用循环,从0和1慢慢的加到我们所求的那个数。
相关题目1:
对于斐波那契数列的问题有许多扩展,其中青蛙跳台阶是比较著名的:
题目:一只青蛙一次可以跳上1级台阶,也可以跳上2级台阶。求该青蛙跳上一个n级台阶总共有多少种跳法?
1个台阶只有一种跳法;
2个台阶有两种跳法:一次跳1级,跳两下,一次跳2级,跳一下;
n个台阶:如果第一次跳了1级,后面有n-1级有f(n-1)种跳法,如果第一次跳了2级,后面有n-2级有f(n-2)中跳法。
典型斐波那契数列。
相关题目2:
题目:我们有个2*1的小矩形横着或竖着去覆盖更大的矩形。请问用8个2*1的小矩形无重叠地覆盖一个2*8的大矩形,总共有多少种方法?
我们用f(8)表示2*8大小矩形的覆盖方法数。
如果我们第一次将2*1大小矩形竖着覆盖大矩形,那么右侧矩形为2*7,它的覆盖方法数即为f(7);
如果我们第一次将2*1大小矩形横着覆盖大局下,那么下面只能横着放,右侧矩形为2*6,它的覆盖方法数即为f(6)。
所有2*8矩形的覆盖方法数为:f(7)+f(6)。这又是典型的斐波那契数列。
说起斐波那契数列对于广大程序员是无人不知呀!对于此问题的解法—–递归。更是深入人心。
public static long Fibonacci(int n){ if(n<0){ return 0; } if(n==1){ return 1; } return Fibonacci(n-1)+Fibonacci(n-2); }
递归的代码简洁明了,似乎这就是我们面试时候要写的代码。但是,递归的效率是特别低下的,这种解法舍去。
与递归一起对应的一种方法—–迭代。提及迭代我们要想到使用循环,从0和1慢慢的加到我们所求的那个数。
public static long Fibonacci(int n){ long f1 = 0; long f2 = 1; long fn = 0; if(n<0){ return f1; } if(n==1){ return f2; } for(int i=2;i<=n;i++){ fn = f1+f2; f1 = f2; f2 = fn; } return fn; }
相关题目1:
对于斐波那契数列的问题有许多扩展,其中青蛙跳台阶是比较著名的:
题目:一只青蛙一次可以跳上1级台阶,也可以跳上2级台阶。求该青蛙跳上一个n级台阶总共有多少种跳法?
1个台阶只有一种跳法;
2个台阶有两种跳法:一次跳1级,跳两下,一次跳2级,跳一下;
n个台阶:如果第一次跳了1级,后面有n-1级有f(n-1)种跳法,如果第一次跳了2级,后面有n-2级有f(n-2)中跳法。
典型斐波那契数列。
相关题目2:
题目:我们有个2*1的小矩形横着或竖着去覆盖更大的矩形。请问用8个2*1的小矩形无重叠地覆盖一个2*8的大矩形,总共有多少种方法?
我们用f(8)表示2*8大小矩形的覆盖方法数。
如果我们第一次将2*1大小矩形竖着覆盖大矩形,那么右侧矩形为2*7,它的覆盖方法数即为f(7);
如果我们第一次将2*1大小矩形横着覆盖大局下,那么下面只能横着放,右侧矩形为2*6,它的覆盖方法数即为f(6)。
所有2*8矩形的覆盖方法数为:f(7)+f(6)。这又是典型的斐波那契数列。
相关文章推荐
- 【剑指offer】【斐波那契数列 】递归还是循环
- 剑指offer_7 斐波那契数列
- 【剑指offer】面试题9:斐波那契数列
- 剑指offer 7 斐波那契数列
- 牛客网-剑指offer-07-斐波那契数列
- [剑指offer]面试题9:斐波那契数列
- 剑指offer(8):斐波那契数列
- 【剑指offer-Java版】09斐波那契数列
- 【剑指Offer学习】【面试题9 : 斐波那契数列】
- 剑指offer--面试题9:斐波那契数列--Java实现
- 剑指offer之斐波那契数列
- 剑指offer:有时间限制 实现斐波那契数列
- 剑指offer 2.4 递归和循环-斐波那契数列计算改进
- (C++)剑指offer-7:斐波那契数列
- 剑指offer 09:斐波那契数列
- 剑指offer--面试题9:斐波那契数列
- 剑指offer 9. 斐波那契数列
- 【剑指offer】斐波那契数列
- 剑指offer——斐波那契数列,跳台阶、变态跳台阶、矩形覆盖
- 剑指offer-11 斐波那契数列