题目:求取斐波那契数列(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; }