题目:求取斐波那契数列(fib)的第n项
思路:规律为前两项的和为第三项,设置前一项,前两项变量和当前的变量,前两项的变量相加
我的踩坑点:int fib(int n){}中必须包含有返回值,返回cur
:循环比递归好使
代码1:递归调用
#include <stdio.h>
int fib(int n) {
//先设置特殊位置的值
if (n == 1 || n == 2) {
return 1;
}
//第i项的值等于(i-1)+(i-2)的和
return fib(n - 1) + fib(n - 2);
}
int main() {
printf("%d\n", fib(8));
return 0;
}
缺点:运算一直在重复,导致计算很慢
改正:计算下一项时,前面算过的值,直接用上次的计算结果而不是重复计算,采用循环数列
#include <stdio.h>
int fib2(int n) {
if (n == 1 || n == 2) {
return 1;
}
int last2 = 1;//第i-2项
int last1 = 1;//第i-1项
int cur = 0;//第i项
for (int i = 3; i <= n; i++) {
//一定要及时更新变量
cur = last1 + last2;
last2 = last1;
last1 = cur;
}
return cur;
}
int main() {
printf("%d\n", fib2(6));
return 0;
}
直接打印此数列
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main(){
int last2 = 1;//第i-2项
int last1 = 1;//第i-1项
int cur = 0;//第i项
int count;//斐波那契的个数
printf("请输入斐波那契的个数:");
scanf("%d", &count);
printf("%d %d\n",last1,last2);//先优先输出前两项的值
for(int i = 2; i < count; i++) {
cur = last1 + last2;
last2 = last1;
last1 = cur;
printf("%d ", cur);
}
return 0;
}