斐波那契数列(fib)

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

}

上一篇:剑指Offer(10-1)斐波拉契数列


下一篇:java. fabonacci数列(递归)