C语言算法:完善当年自编的k阶斐波那契数列

以下为大二时候的日志回放:
“ 题目扩展到K阶,

k阶斐波那契数列, 1阶(即k=1):1、1、1、1、1、1、1、……

a0=a[1-1]=1,a1=1,a2=1,a3=1,a4=1,a5=1,a6=1……

3阶(k=3):0、0、1、1、2、4、7、、、、、

a0=0,a1=0,a2=a[3-1]=1,a3=0+0+1=1,a4=0+1+1=2,a5=1+2+4=7

4阶:0、0、0、1、1、2、4、8、15、27……

a0=0,a1=0,a2=0,a3=a[4-1]=1,a4=1,a5=2,a6=4……a[8]=1+2+4+8=15……

问题一般化,可以看出:

数列的前k-2项的值都为0;

第k-1项的值为1;

第k到2k-1项的值为2的n次方(也是前k项和,但同时与2的n次方值相同);

第2k项以后的值是前k项和;

网上说用‘递归’的方法,而且只是对应2阶,没扩展到K阶,小弟还熟练‘递归’,还是继续使用顺序求法。

C算法:

Status Fibonacci(int k, int m, int &f)
/* 求k阶斐波那契数列的第m项的值f    */
{
 int a[100],i,y,z=0;     /*定义一个元素数目为100的数组。*/
 if(k<=1||m<0)return ERROR;    /*如果输入的参数不规范,返回错误警告*/
 else if(m<k-1)f=0;      /*恒等于数据段的处理*/
 else if(m==k-1)f=1;
 else if(m<=2*k-1)f=pow(2,m-k);    /*二次方段的处理*/
 else                  /*K阶段的处理,时间复杂度剧增*/
 {
 for(y=0;y<k;y++)      /*用for循环,给K个数组元素赋值*/
 a[y]=pow(2,y);
 for(i=2*k;i<=m;i++)
 {
 a[k]=0;              /*a[k]每次循环清零一次*/
 for(y=0;y<k;y++)      /*内嵌于for循环体里边的for循环体*/
 {
 a[k]=a[k]+a[y];        /*前k项连加*/
 } 
  a[z]=a[k];   /*每次移动地把值最小的元素的值铲除,改成最大值,不用逐一赋值,省下大批时间,再次加入“输出a[k]的值”可以实现前m-k项和输出*/
  z++;      /*z每次自加1,确保每次都用前k项的最大项覆盖最小项*/
  if (z==k)z=0;  /*当z==k时,z归零*/ 
 }
  f=a[k];      /*输出所求值:k阶斐波那契数列的第m项的值f */
 }
 return OK;
}

以下为优化后的算法,在Obline Judge中有较快的处理时间。

Status Fibonacci(int k, int m, int &f)
/* 求k阶斐波那契数列的第m项的值f    */
{
 long a[300], i, y, z=0;                    /*定义一个元素数目为300的数组,在long的极限不到第300个数字。*/
 if(k <= 1||m < 0)return ERROR;    /*如果输入的参数不规范,返回错误警告*/
 else if(m < k-1)f=0;                       /*恒等于数据段的处理*/
 else if(m == k-1)f=1;
 else for(i=0; i<k; i++)a[i]=0;  a[k]=1;                            /*输入k个0和a[k]=1的初始数字*/
 for(y=k+1; y<=m; y++) a[y]=a[y-1]*2-a[y-k];          /*规律:第y数字等于第y-1的数字乘以2减去第y-k个数字*/
  f=a[y-1];                            /*输出所求值:k阶斐波那契数列的第m项的值f */
 }
 return OK;
}
时间: 2024-10-05 18:06:53

C语言算法:完善当年自编的k阶斐波那契数列的相关文章

算法题---k阶斐波那契数列

#include <iostream> #include <cstdio> #include <stdlib.h> #include <algorithm> using namespace std; int main() { int a[120]; int k, m; while (1) { cout << "输入阶数k和约定的常数max.k和max用空格分开." << endl; cin >> k &

《BI那点儿事》Microsoft 时序算法——验证神奇的斐波那契数列

斐波那契数列指的是这样一个数列 0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233,377,610,987,1597,2584,4181,6765,10946,17711,28657,46368斐波那契数列的发明者,是意大利数学家列昂纳多·斐波那契(Leonardo Fibonacci),生于公元1170年,卒于1250年,籍贯是比萨.他被人称作“比萨的列昂纳多”.1202年,他撰写了<算盘全书>(Liber Abacci)一书.他是第一个研究了

最优化算法-斐波那契数列搜索

斐波那契数列搜索,参考Edwin<最优化导论>第四版7.3章节,算法采用go语言实现. /***************************************** * FileName : fibonacci_search.go * Author : fredric * Date : 2017.09.01 * Note : 斐波那契数列搜索算法 * History : *****************************************/ package search

算法导论-求(Fibonacci)斐波那契数列算法对比

目录 1.斐波那契数列(Fibonacci)介绍 2.朴素递归算法(Naive recursive algorithm) 3.朴素递归平方算法(Naive recursive squaring) 4 .自底向上算法(Bottom-up) 5. 递归平方算法(Recursive squaring) 6.完整代码(c++) 7.参考资料 内容 1.斐波那契数列(Fibonacci)介绍 Fibonacci数列应该也算是耳熟能详,它的递归定义如上图所示. 下面2-6分别说明求取Fibonacci数列的

一起talk C栗子吧(第四回:C语言实例--斐波那契数列)

各位看官们,大家好,从今天开始,我们讲大型章回体科技小说 :C栗子,也就是C语言实例.闲话休提, 言归正转.让我们一起talk C语言实例吧! 看官们,上一回中咱们说的是求阶乘的例子,这一回咱们说的例子是:斐波那契数列. 看官们,斐波那契数列是以数学家斐波那契数列的姓来命名的.斐波那契数列的定义:数列的第0项和第1项 为1,第n项为第n-1项和第n-2项的和.用数学公式表示出来就是:f(n)=f(n-1)+f(n-2),其中(n>1),f(n)=1;(n=0,1). 看官们,我在程序中使用了递归

js算法集合(二) javascript实现斐波那契数列 (兔子数列) Javascript实现杨辉三角

js算法集合(二)  斐波那契数列.杨辉三角 ★ 上一次我跟大家分享一下做水仙花数的算法的思路,并对其扩展到自幂数的算法,这次,我们来对斐波那契数列和杨辉三角进行研究,来加深对Javascript的理解. 一.Javascript实现斐波那契数列 ①要用Javascript实现斐波那契数列,我们首先要了解什么是斐波那契数列:斐波那契数列(Fibonacci sequence),又称黄金分割数列.因数学家列昂纳多·斐波那契(Leonardoda Fibonacci)以兔子繁殖为例子而引入,故又称为

斐波那契数列公式算法-JS实现

之前算斐波那契数列都是算前两个数相加实现的 比如0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233,377,610,987,1597,2584,4181,6765,10946,17711,28657,46368 2=1+1 3=1+2 5=2+3 8=3+5 …… 其实还有另外一个规律: 2 = 1*2-03 = 2*2-15 = 3*2-18 = 5*2-213= 8*2-321=13*2-5 …… 下面是JS实现的代码: <!DOCTYPE h

算法学习笔记 递归之 快速幂、斐波那契矩阵加速

递归的定义 原文地址为:http://blog.csdn.net/thisinnocence 递归和迭代是编程中最为常用的基本技巧,而且递归常常比迭代更为简洁和强大.它的定义就是:直接或间接调用自身.经典问题有:幂运算.阶乘.组合数.斐波那契数列.汉诺塔等.其算法思想: 原问题可分解子问题(必要条件): 原与分解后的子问题相似(递归方程): 分解次数有限(子问题有穷): 最终问题可直接解决(递归边界): 对于递归的应用与优化,直接递归时要预估时空复杂度,以免出现用时过长或者栈溢出.优化递归就是以

算法——动态规划篇——斐波那契数列

斐波那契数列,又称黄金分割数列,指的是这样一个数列:0.1.1.2.3.5.8.13.21.--在数学上,斐波纳契数列以如下被以递归的方法定义:F0=0,F1=1,Fn=F(n-1)+F(n-2)(n>=2,n∈N*)在现代物理.准晶体结构.化学等领域,斐波纳契数列都有直接的应用,为此,美国数学会从1960年代起出版了<斐波纳契数列>季刊,专门刊载这方面的研究成果. 以上内容来自百度百科.. 今天主要是想用动态规划的思想求解斐波那契数列,用来观察动态规划带来的优势,空间换时间,不重复求解