每天一道ACM(1003)--斐波那契数列

本来决定上个月开始每天做一两道acm的,结果总是这里忙那里忙的,时间就这么溜走了。

没时间都是借口,刷一道题不过半小时左右,要坚持,从今天开始!


/*
 * acm.njupt.edu.cn---1003
 *
 * 在数学上,斐波那契数列(Fibonacci Sequence),是以递归的方法来定义:
 * F0 = 0
 * F1 = 1
 * Fn = Fn - 1 + Fn - 2
 * 用文字来说,就是斐波那契数列由0和1开始,之后的斐波那契数就由之前的两数相加。首几个斐波那契数是:
 * 0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987, 1597, 2584, 4181, 6765, 10946,………………
 *
 * 输入:斐波那契数列项数n,0≤n≤40。
 *
 * 输出:斐波那契数列第n项数值
 *
 */

#include <stdio.h>

using namespace std;

int getFeberNum(int n);

int main() {
	int n;
	scanf("%d", &n);

//	cout << getFeberNum(n) << endl;
	printf("%d\n", getFeberNum(n));
	return 0;
}

/*
 * 获取第n项的斐波那契数,注意0不是第一项,0是第0项
 */
int getFeberNum(int n) {
	/*
	 * 观察斐波那契数列可以发现,
	 * k>=1时
	 * a[k+1]-a[k]=a[k-1]
	 * 用递归应该可以做
	 * a[k+1]=a[k]+a[k-1]
	 *
	 * k>=2时
	 * a[k]=a[k-1]+a[k-2]
	 *
	 * 后来发现递归会超时,需要换一种方法
	 *
	 */
	int f;
	int f1 = 1, f2 = 1; //第一轮传入参数的时候,f1为a[1],f2为a[2]

	int result = 0;
	if (n <= 1) {
		result = n;
	} else {
//		result = getFeberNum(n - 1) + getFeberNum(n - 2); //递归调用会超时
		for (int i = 2; i < n; i++) {
			f = f1 + f2;
			f1 = f2;
			f2 = f;
		}
		result = f;
	}
	return result;
}

你可能感兴趣的:(C++,递归,数学,ACM,斐波那契)