【背景】
【思路1-递归】
int Fibonacci(int n){
if(n <= 2){
return n;
}
return Fibonacci(n - 1) + Fibonacci(n - 2);
}
进一步优化:
当n增大到一定数值,Fibonacci数列值会溢出,并且花费时间很长。
long long Fibonacci(int n){
if(n <= 2){
return n;
}
return Fibonacci(n - 1) + Fibonacci(n - 2);
}
【思路2-递推关系式的优化】
long long Fibonacci(int n){
long long* Fibonacci = (long long*)malloc(sizeof(long long)*(n+1));
Fibonacci[0] = 0;
Fibonacci[1] = 1;
for(int i = 2;i <= n;i++){
Fibonacci[i] = Fibonacci[i-1] + Fibonacci[i-2];
}
return Fibonacci[n];
}
该思路的另一种实现方法:
long long Fibonacci(int n){
int i;
long long fibonacciA = 0;
long long fibonacciB = 1;
long long fibonacciC;
if(n == 0){
return 0;
}
else if(n == 1){
return 1;
}
for(i = 2;i <= n;i++){
fibonacciC = fibonacciA + fibonacciB;
fibonacciA = fibonacciB;
fibonacciB = fibonacciC;
}
return fibonacciC;
}
【思路3-求解通项公式】
int Fibonacci(int n) {
double s = sqrt(5);
// floor 返回小于或者等于指定表达式的最大整数
return floor((pow((1+s)/2, n) - pow((1-s)/2, n))/s + 0.5);
}
当n增大到一定数值,Fibonacci数列值会溢出。因为floor返回小于或者等于指定表达式的最大整数
【思路4-分支策略】
#include <iostream>
#include <malloc.h>
#include <stdio.h>
using namespace std;
//矩阵乘法
void MatrixMulti(long long matrix[2][2],long long matrix2[2][2]){
long long a = matrix[0][0] * matrix2[0][0] + matrix[0][1] * matrix2[1][0];
long long b = matrix[0][0] * matrix2[0][1] + matrix[0][1] * matrix2[1][1];
long long c = matrix[1][0] * matrix2[0][0] + matrix[1][1] * matrix2[1][0];
long long d = matrix[1][0] * matrix2[0][1] + matrix[1][1] * matrix2[1][1];
matrix[0][0] = a;
matrix[0][1] = b;
matrix[1][0] = c;
matrix[1][1] = d;
}
//Fibonacci数列
long long Fibonacci(int value){
if(value == 0){
return 0;
}
long long A[2][2] = {1,1,1,0};
//初试为单位矩阵
long long Matrix[2][2] = {1,0,1,0};
int n = value - 1;
for(; n ;n >>= 1){
//奇偶
if(n&1){
MatrixMulti(Matrix,A);
}//if
MatrixMulti(A,A);
}//for
return Matrix[0][0];
}
int main() {
int i,n,height;
while(scanf("%d",&n) != EOF){
long long result;
for(i = 0;i <= n;i++){
result = Fibonacci(i);
printf("%lld\n",result);
}//for
}//while
return 0;
}
该思路另一种解析:
【相关题目】
剑指Offer之斐波那契数列
剑指Offer之跳台阶
剑指Offer之矩形覆盖
LeetCode之Climbing Stairs
分享到:
相关推荐
Fibonacci数列斐波那契数列PPT学习教案.pptx
在数学上它以递归的方式进行定义,指这样的一个数列:0、1、1、2、3、5、8、13、21、34、55、89、144……,即前两个数为分别为0和1,从第3项开始,每项的值都等于其前两项之和。斐波那契数列Fib(n)用公式表示为: ...
C++斐波那契数列C++斐波那契数列C++斐波那契数列C++斐波那契数列C++斐波那契数列C++斐波那契数列C++斐波那契数列C++斐波那契数列C++斐波那契数列C++斐波那契数列C++斐波那契数列C++斐波那契数列C++斐波那契数列C++...
一 生小兔问题引起的二 它们也产生斐波那契数列三 通项的其他表达式四 斐波那契数列是二阶循环数列五 斐波那契数列的数论性质六 斐波那契数列的其他性质七 某些斐波那契数列之和八 斐波那契数列与连分数九 斐波那契...
1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, ...return fibonacci(num - 1) + fibona
少儿编程之斐波那契数列
【C++】斐波那契数列应用的一个实例。这是关于斐波那契数列的一个例子,用C++语言实现
本代码使用C++语言书写,编译环境VS2013。...斐波那契数列(Fibonacci Sequence)又称黄金分割数列,指的是这样一个数列:0、1、1、2、3、5、8、13、21、…… 本代码是练习作品,如有错误或修改,请指正,感谢感谢。
使用C++非递归实现fibonacci数列,对正在学习算法的同学应该挺有帮助的
【问题描述】编写函数f,功能是用递归的方法求斐波那契数列的第n项,函数原型为 int f(int n),在主函数中输入一个正整数n,调用函数f求出斐波那契数列的第n项,并在主函数中输出。 斐波那契数列:1,1,2,3,5,8,13,...
递归方法实现斐波那契数列
Python编程题--斐波那契数列
递归方法 def fibonacci(n): if n <= 1: return n else: return fibonacci(n-1) + fibonacci(n-2) n = int(input("请输入要计算的斐波那契数列的项数:")) print("斐波那契数列的第", n, "项为:", fibonacci(n)) 2...
编写一个Java程序,用于输出Fibonacci数列的前20项。
里面是【斐波那契数列】的前100项,可以当做学习过程中对照是否正确等使用,加油!
这个数列不但完美的体现了数学之美,还把很多看上去似乎彼此都很独立的数学概念紧密的联系在一起。由此可见,研究斐波那契数列是非常重要的,它即可以对各个学科有很好的作用,它也会长久的影响我们的生活。 本文...
# 题目:斐波那契数列。 # 程序分析:斐波那契数列(Fibonacci sequence),从1,1开始,后面每一项等于前面两项之和。图方便就递归实现,图性能就用循环。
Fibonacci数列,用c++编写的,非递归的函数调用求Fibonacci数列的第n项
汇编语言,两种方法计算斐波那契数列的前22项,斐波那契数列,分别用两种方法:递归调用,普通循环加法,使用DOSBox验证
斐波那契数列实现的C++代码;代码易懂易扩展。