fibonacci求解
来源:互联网 发布:淘宝优惠券在哪领 编辑:程序博客网 时间:2024/06/05 15:44
fibonacci求解
fibonacci 斐波那契数组编程上比较常见的数组(1 1 2 3 5 8 13 …),其定义为:
从第三个数字开始,每个数字都是前两个数字之和
求解的方法有:
递归,自顶向下求解:
int Fibonacci(int n) { if(n == 0) return 0; if(n == 1) return 1; return Fibonacci(n-1) + Fibonacci(n-2);}
非递归1:维持一个数组(DP)
// 非递归1int Fib(int n){ int array[n] = {0}; array[1] = 1; for (int i = 2; i < n; i++) array[i] = array[i-1] + array[i-2]; return array[n-1];}
非递归2,维持n的前两个值(DP)
// 非递归2int Fib(int n){ if ( n == 0 || n == 1){ return 1; } int a = 1, b = 1; int sum ; for( int i = 2; i <= n; i ++ ){ // 注意a b更新的次序 sum = a+b; a = b; b = sum; } return sum;}
常见题目:
leetcode 中经典的爬楼梯问题
You are climbing a stair case. It takes n steps to reach to the top.
Each time you can either climb 1 or 2 steps. In how many distinct ways can you climb to the top?
也就是 爬n个楼梯,一次爬1阶或2阶,走到n阶有几种走法兔子数组(Fibonacci 本质问题)
假设每对兔子每月能生一对小兔子,小兔子长到第3个月时也开始生兔子。假设兔子不会死,问第n个月有多少个兔子
另外,算法导论上也有一个矩阵相乘的方法(很少用)
由Fibonacci数列的特性可以知道:
(1)当n>1时,可以发现Fib(n)和Fib(n-1)是互质的
(2)若定义一个i为奇数,则f(i)*f(i) = f(i-1)*f(i+1)-1;若i为偶数,则f(i)*f(i)=f(i-1)*f(i+1)-1
(3)f(n)=f(i)*f(n-i-1)+f(i+1)*f(n-i)
f(n)=f(1)*f(n-2)+ f(2)*f(n-1)=f(2)*f(n-3)+ f(3)*f(n-2)=f(3)*f(n-4)+ f(4)*f(n-3)
若要计算Fib(n),就是要先保存,令a = f(1),b = f(2),然后在进行运算,使a’=b,b’=a+b
可把a,b看做一个向量[a, b],然后乘以矩阵
0 1
1 1
即若要求第100个Fibonacci数,只需要将[1, 1]乘上
0 1
1 1 的100次方,再取出第一项即可。
时间复杂度:O(logn)
空间复杂度:O(1)
代码贴上来:
// Multiply two matrices// Input: matrix1 - the first matrix// matrix2 - the second matrix//Output: the production of two matrices///////////////////////////////////////////////////////////////////////Matrix2By2 MatrixMultiply( const Matrix2By2& matrix1, const Matrix2By2& matrix2){ return Matrix2By2( matrix1.m_00 * matrix2.m_00 + matrix1.m_01 * matrix2.m_10, matrix1.m_00 * matrix2.m_01 + matrix1.m_01 * matrix2.m_11, matrix1.m_10 * matrix2.m_00 + matrix1.m_11 * matrix2.m_10, matrix1.m_10 * matrix2.m_01 + matrix1.m_11 * matrix2.m_11);}///////////////////////////////////////////////////////////////////////// The nth power of matrix // 1 1// 1 0///////////////////////////////////////////////////////////////////////Matrix2By2 MatrixPower(unsigned int n){ assert(n > 0); Matrix2By2 matrix; if(n == 1) { matrix = Matrix2By2(1, 1, 1, 0); } else if(n % 2 == 0) { matrix = MatrixPower(n / 2); matrix = MatrixMultiply(matrix, matrix); } else if(n % 2 == 1) { matrix = MatrixPower((n - 1) / 2); matrix = MatrixMultiply(matrix, matrix); matrix = MatrixMultiply(matrix, Matrix2By2(1, 1, 1, 0)); } return matrix;}// templatesstruct Fib{ enum{ val = Fib<N-1>::val + Fib<N-2>::val };};template <>struct Fib<0>{ enum{ val = 0 };};template <>struct Fib<1>{ enum{ val=1 };};
- Fibonacci求解
- fibonacci求解
- Fibonacci数简单求解
- 求解fibonacci数
- 求解 Fibonacci 面试题
- Fibonacci数列求解
- 求解Fibonacci数列
- 更高效的Fibonacci求解
- Fibonacci数列求解方法总结
- Fibonacci(斐波纳契)数列求解 zz
- 3070 Fibonacci(O(log n)求解 )
- Fibonacci数列的应用和求解
- 探索Fibonacci数列的最佳求解方法
- 浅议Fibonacci(斐波纳契)数列求解
- Algorithm学习笔记 --- Fibonacci(递归求解)
- 两种方法求解Fibonacci数列
- 动态规划法实现fibonacci数列求解
- 四种方法求解Fibonacci数列
- Java学习心得之面向对象(一)
- hilbert矩阵
- CentOS7编译WD My Cloud下的SVN(Subversion)(附编译好的SVN的链接)
- Spring系列之Spring常用注解总结
- 浅析Android下的Android.mk文件(二)
- fibonacci求解
- HTML文本编辑器
- 数据库MYSQL入门教程(4)——VS开发环境配置
- 欠拟合与过拟合
- meta标签的特殊用法
- 4.3
- html/jsp如何固定图像的大小
- 守着再也没有的你
- Android四大组件