题目来源:509. 斐波那契数 - 力扣(LeetCode)
方法一:(动态规划)
首先找到斐波那契数的边界条件F(0)=0 和 F(1)=1。
当n>1时,每项的和都等于前两项的和,即:F(n)=F(n−1)+F(n−2)。
可以联想滚动数组思想。
p | q | r=p+q |
0 | 0 | 1 |
第1位 | 第2位 | 第3位 |
整体向后移动一位
p | q | r=p+q | |
0 | 0 | 1 | 1 |
第1位 | 第2位 | 第3位 | 第4位 |
整体向后移动一位
p | q | r=p+q | |
0 | 1 | 1 | 2 |
第2位 | 第3位 | 第4位 | 第5位 |
#include<stdio.h>
int fib(int n) {
if (n < 2) {
return n;
}
int p = 0, q = 0, r = 1;
for (int i = 2; i <= n; ++i) {
p = q;
q = r;
r = p + q;
}
return r;
}
int main()
{
int n;
scanf("%d", &n);
printf("%d", fib(n));
return 0;
}
方法二:(递归法)
#include<stdio.h>
int fib(int n)
{
if (n >= 3)
{
return fib(n - 1) + fib(n - 2);
}
else {
return 1;
}
}
int main()
{
int n;
scanf("%d", &n);
printf("%d", fib(n));
return 0;
}
方法三:(数组法)
该方法类似方法一动态规划,与方法二相比,方法一、三根据公式自下而上推出斐波那契数。而此处引入数组是为了方便将相应位置的数值打印或调用。
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include <malloc.h>
void fib(int n)
{
int i;
int* arr = (int*)malloc((n+1) * sizeof(int));//n+1是为了避免实际使用内存比申请的内存大,而为释放内存埋下隐患
arr[0] = 0;
arr[1] = 1;
if (n >= 2) {
for (i = 2; i <= n; i++)
{
arr[i] = arr[i - 1] + arr[i - 2];
}
}
else if(n==1){
i = 1;
}
else
{
i = 0;
}
printf("%d", arr[n]);
free(arr);//释放分配的内存
}
int main()
{
int n;
scanf("%d", &n);
fib(n);
return 0;
}
该算法是用了动态内存开辟数组空间,从而达到需求多少,内存空间供应多少的效果。关于动态内存开辟数组空间请移步我的另一篇博客:关于E0028错误:表达式必须含有常量值的原因以及解析-CSDN博客
最后,关于该题还有很多其他解题方法,欢迎评论区共同探讨。