题目来源: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博客
最后,关于该题还有很多其他解题方法,欢迎评论区共同探讨。