天天看点

第n个斐波那契数(C语言)

/递归和非递归分别实现求第n个斐波那契数/

//思路:

//斐波那契数列指的是1,1,2,3,5,8,13,21……这样的一个数列

//第一个和第二个斐波那契数为1;

//从第三个斐波那契数开始,第n个斐波那契数等于第n-1个和第n-2个斐波那契数的和

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>

//非递归求第n个斐波那契数
void Fibonacci_non(int n){
	int f1 = 1;  //变量f1赋值为第一个斐波那契数值
	int f2 = 1;  //变量f2赋值为第二个斐波那契数值
	for (int i = 3; i <= n; ++i){  //从第三个斐波那契数开始求第n个斐波那契数
		f2 = f1 + f2;  //变量f2的值更新为f1和f2的和
		f1 = f2 - f1;  //变量f1的值更新为求和前f2的值
	}
	if (n == 1 || n == 2){  //若用户要第一个或第二个斐波那契的值
		printf("第%d个斐波那契数是%d.\n", n, f2);  //打印输出结果
	}
	else{
		printf("第%d个斐波那契数是%d.\n", n, f2);  //打印输出结果
	}
}

//递归求第n个斐波那契数函数
int Fibonacci(int n){
	if (n == 1 || n == 2){  //若n等于1或n等于2
		return 1;  //返回1
	}
	return Fibonacci(n - 1) + Fibonacci(n - 2);  //递归调用递归求第n个斐波那契数函数
}

//主函数
int main(){
	int n;  //变量n用以保存用户所要的斐波那契数
	int ret;  //变量ret用以接收递归调用的返回值
	printf("请输入您想要的n(即第n个斐波那契数):\n");  //提示用户输入信息
	scanf("%d", &n);  //用以保存用户所要的斐波那契数
	Fibonacci_non(n);  //调用非递归求第n个斐波那契数函数
	ret = Fibonacci(n);  //将递归求第n个斐波那契数函数的返回值赋给ret
	printf("第%d个斐波那契数是%d.\n", n, ret);  //打印输出结果
	system("pause");
	return 0;
}
           

继续阅读