斐波纳契数列问题小结——菜鸡进化史

第一次开始写笔记,以前也不知道刷题,也不知道写笔记,废话不多说,领扣上的入门级题目斐波纳契数列

查找斐波纳契数列中第 N 个数。
所谓的斐波纳契数列是指:
前2个数是 0 和 1 。
第 i 个数是第 i-1 个数和第i-2 个数的和。
斐波纳契数列的前10个数字是:
0, 1, 1, 2, 3, 5, 8, 13, 21, 34 ...
第一次头铁直接写,上了递归,然后华丽的超时了(笑)
代码如下
int fibonacci(int n) {
if(1==n)
return 0;
if(2==n)
return 1;
int result;
result =fibonacci(n-1)+fibonacci(n-2);
return result;
}
然后想了一下学聪明了,用个数组存起来已经计算出来的数不行吗
新知识点来了划重点
用static初始化数组可使得数组只被定义一次之后递归调用的时候可以修改,但不会重复定义
int fibonacci(int n) {
static int temresult[100] = { -1 };
temresult[1] = 0;
temresult[2] = 1;
if (1 == n)
return 0;
if (2 == n)
return 1;
int result,a1,a2;
if (-1==temresult[n-1])
{
temresult[n - 1] = fibonacci(n - 1);
}
if (-1 == temresult[n - 2])
{
temresult[n - 2] = fibonacci(n - 2);
}
result = temresult[n - 1] + temresult[n - 2];
return result;
}
以为这就完了,不,问题又出来了,错的还是最基本的。
static int temresult[100] = { -1 };
就是这一行数组的定义错误,这样定义只会吧最开始的元素变为-1而编译器会把其余其他99个元素自动定义为0
没办法,改吧
既然这里面要求的数据含零和数组的自动定于冲突,那就给他弄个标记数组visited[100]来记录这个有没有算过,代码如下
int fibonacci(int n) {
static int temresult[100] = { 0 };
static int visited[100] = { 0 };
temresult[1] = 0;
temresult[2] = 1;
if (1 == n)
return 0;
if (2 == n)
return 1;
int result,a1,a2;
if (0==visited[n-1])
{
temresult[n - 1] = fibonacci(n - 1);
visited[n - 1] = 1;
}
if (0 ==visited[n - 2])
{
temresult[n - 2] = fibonacci(n - 2);
visited[n - 2] = 1;
}
result = temresult[n - 1] + temresult[n - 2];
return result;
}
然后我又发现了这跟之前接触到的一个东西很像——动态规划的走楼梯种类
具体可以看一下这个网址上的漫画
http://www.sohu.com/a/153858619_466939
稍微加点解释吧,不想看上面的网址的话,也能快速了解
f(n)=f(n-1)+f(n-2)
以及边界条件
f(1)=0,f(2)=1
可以模拟自下而上的计算,n是几就计算n-2遍
那么我们可以用三个变量a,b,result 来分别储存:结果(f(n)),以及之前的两个相加的量(f(n-1)和f(n-2))
对变量进行这样的处理就可以让a一直等于f(n-1)而b一直等于f(n-2)
result = a + b;//即是f(n)=f(n-1)+f(n-2)
a=b;
b = result;
——————————————————————————
总的代码如下
int fibonacci(int n) {
int result,a=0,b=1;
if (1==n)
return 0;
if (2 == n)
return 1;
for (int i = 0; i < n-2; i++)
{
result = a + b;//即是f(n)=f(n-1)+f(n-2)
a=b;
b = result;
}
return result;
}

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,406评论 6 503
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,732评论 3 393
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 163,711评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,380评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,432评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,301评论 1 301
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,145评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,008评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,443评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,649评论 3 334
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,795评论 1 347
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,501评论 5 345
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,119评论 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,731评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,865评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,899评论 2 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,724评论 2 354

推荐阅读更多精彩内容

  • 在C语言中,五种基本数据类型存储空间长度的排列顺序是: A)char B)char=int<=float C)ch...
    夏天再来阅读 3,342评论 0 2
  • "use strict";function _classCallCheck(e,t){if(!(e instanc...
    久些阅读 2,030评论 0 2
  • Lua 5.1 参考手册 by Roberto Ierusalimschy, Luiz Henrique de F...
    苏黎九歌阅读 13,793评论 0 38
  • 其实每天都蛮心累的 不知道未来在何方 不想交流 不想做任何事 谈人生吗 是你在教导我吧 对不起 你失败了 逛日月光...
    角落蜷缩阅读 125评论 0 0