一篇让你彻底玩明白斐波那契数列~

884 阅读2分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第23天,点击查看活动详情

什么是斐波那契数列

斐波那契数列(Fibonacci sequence),又称黄金分割数列,因数学家莱昂纳多·斐波那契(Leonardo Fibonacci)以兔子繁殖为例子而引入,故又称为“兔子数列”,指的是这样一个数列:1、1、2、3、5、8、13、21、34、……在数学上,斐波那契数列以如下被以递推的方法定义:F(0)=0,F(1)=1, F(n)=F(n - 1)+F(n - 2)(n ≥ 2,n ∈ N*)在现代物理、准晶体结构、化学等领域,斐波纳契数列都有直接的应用,为此,美国数学会从 1963 年起出版了以《斐波纳契数列季刊》为名的一份数学杂志,用于专门刊载这方面的研究成果。


简单来说斐波那契数列就是前两项都是1然后后面的项都是这个项的前两项之和,这就是斐波那契数列。 image.png

斐波那契数列的简单代码化

斐波那契数列讲究的是递归,那么代码就很清晰了~

image.png 我们可以把斐波那契数列看成是一颗二叉树 image.png 但是我们需要看到的是,如果要求斐波那契的第10000项怎么办?无数次的递归,这里头包含了多次重复的递归求法,那有什么办法来改进呢?

备忘录·斐波那契

我们记录一下斐波那契的每一项,当深层递归时,如果找到了备忘录就直接用备忘录里面的值 image.png

真题:

7-1 斐波那契数列第N项(10 分)

题目描述:

输出斐波那契数列第N项(假设N<1000)。斐波那契数列:1,1,2,3,5,8,13……

输入格式:

一个正整数N, 表示斐波那契数列第N项。

输出格式:

斐波那契数列第n项的值

输入样例:

5

输出样例:

5

代码长度限制   16 KB

时间限制     400 ms

内存限制     64 MB

代码如下:

#include<bits/stdc++.h>
using namespace std;
long long momo[1005];
long long fib(int n) {
	if (n <= 0)
		return -1;
	if (n == 1 || n == 2)
		return 1;
	if (momo[n] != -1)
		return momo[n];
	momo[n] = fib(n - 1) + fib(n - 2);
	return momo[n];
}
int main()
{
	long long n;
	cin >> n;
	memset(momo, -1, 1005);
	cout << fib(n);
}