初识C语言学习笔记练习 斐波那契数

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

例如:

输入:5  输出:5

输入:10, 输出:55

输入:2, 输出:1


斐波那契数的定义:斐波那契数列(Fibonacci sequence),又称黄金分割数列,因数学家莱昂纳多·斐波那契(Leonardo Fibonacci)以兔子繁殖为例子而引入,故又称为“兔子数列”,指的是这样一个数列:1、1、2、3、5、8、13、21、34、……在数学上,斐波那契数列以如下被以递推的方法定义:F(0)=0,F(1)=1, F(n)=F(n - 1)+F(n - 2)(n ≥ 2,n ∈ N*)。

 

 


思路:1.递归方法

创建一个求第n个斐波那契数的函数,按照递推数列,当n大于2时,也就是求第三个斐波那契数或更后面的斐波那契数时,要不断递归求n到2的斐波那契数,例如求第50个斐波那契数,要递归先求第49和48个斐波那契数,以此类推,便能实现,但这样的算法有很大的缺陷,会反复求同一个斐波那契数,例如求第50个斐波那契数,其中46会被反复求4次,这样很费时间,因此,可以用非递归的方法。

 

 


 2.非递归方法

用while循环,当n>2时,c = a+b,a= b,b = c,n--,不断循环计算便可实现最简的算法。


代码

递归方法

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>

int Fibonacci(int n) {
	if (n <= 2) {
		return 1;
	}
	else {
		return Fibonacci(n - 1) + Fibonacci(n - 2);
	}
	
}

int main() 
{
	int n = 0;
	printf("请输入要求的第n个斐波那契数:\n");
	scanf("%d",&n);
	int ret = Fibonacci(n);
	printf("输出:%d\n",ret);
	return 0;
}

非递归方法(循环)

int Fib(int n)
{
	int a = 1;
	int b = 1;
	int c = 1;
	while (n > 2)
	{
		c = a + b;
		a = b;
		b = c;
		n--;//n要不断减小
	}
	return c;//当n=1或2时,返回1
}

int main() 
{
	int n = 0;
	printf("请输入要求的第n个斐波那契数:\n");
	scanf("%d",&n);
	int ret = Fib(n);
	printf("输出:%d\n",ret);
	return 0;
}

结果

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 斐波那契数列是一个非常著名的数列,它的前两项为和1,从第三项开始,每一项都是前两项的和。C语言中可以使用函数来求斐波那契数列中的某一项,具体实现方法如下: ```c #include <stdio.h> int fibonacci(int n) { if (n == || n == 1) { return n; } else { return fibonacci(n - 1) + fibonacci(n - 2); } } int main() { int n; printf("请输入要求的斐波那契数列的项数:"); scanf("%d", &n); printf("第%d项的值为:%d\n", n, fibonacci(n)); return ; } ``` 在上面的代码中,我们定义了一个名为fibonacci的函数,它的参数n表示要求的斐波那契数列的项数。如果n等于或1,直接返回n;否则,递归地调用fibonacci函数,求出前两项的和,即为第n项的值。在主函数中,我们通过scanf函数获取用户输入的n值,然后调用fibonacci函数求出第n项的值,并通过printf函数输出结果。 需要注意的是,由于递归调用fibonacci函数的过程中会产生大量的重复计算,因此当n较大时,程序的效率会非常低下。为了提高效率,可以使用循环或者动态规划等方法来求解斐波那契数列。 ### 回答2: C语言是一种广泛使用的编程语言,其语法简单、结构清晰、功能强大,应用广泛。Fibonacci数列是一种特殊的数列,其特点是前两个数相加等于第三个数,如1,1,2,3,5,8,13,21…… 要求用C语言编写函数求Fibonacci数列,可以使用递归和循环两种方法。 一、递归方法: 在C语言中,递归方法是一种将问题分解成更小的子问题并进行解决的方法。在求Fibonacci数列时,可以将其分解成两个部分:前面的数加上它之前的一个数等于后一个数。 以下是递归方法的代码: int fibonacci(int n) { if (n == 0 || n == 1) { return n; } return fibonacci(n-1) + fibonacci(n-2); } 该函数会递归调用自身,求解Fibonacci数列。在该代码中,有两个边界条件:当n等于0或1时,返回n,否则,返回前两个数的和。 二、循环方法: 在C语言中,可以使用循环来求解Fibonacci数列,可以使用for、while、do while等语句进行实现。以下是使用for循环实现的代码: int fibonacci(int n) { int a = 0, b = 1, c, i; if (n == 0 || n == 1) { return n; } for (i = 2; i <= n; i++) { c = a + b; a = b; b = c; } return b; } 该函数会使用for循环来计算Fibonacci数列,首先定义三个变量a、b、c,分别表示数列中的前两个数和当前数。如果n等于0或1,直接返回n,否则使用for循环计算数列中的当前数。在每次循环中,将前两个数相加,得到当前数,同时将a、b的值进行更新。 总结: 使用递归和循环两种方法,都可以实现求解Fibonacci数列。递归方法适用于求解小规模的数列,而循环方法则适用于求解大规模的数列。对于初学者而言,建议使用循环方法,因为它的执行效率更高。在程序设计中,应根据实际情况选用最适合的方法。 ### 回答3: Fibonacci数列是一种数学序列,其前两个数为0和1,第n个数为前两个数之和,即F(n)=F(n-1)+F(n-2)。因此,Fibonacci数列可以用递归函数或迭代函数来求解。 在C语言中,我们可以使用递归函数来求解Fibonacci数列。以下是一个使用递归函数的示例代码: ```c #include <stdio.h> int fibonacci(int n) { if (n == 0 || n == 1) { return n; } else { return fibonacci(n - 1) + fibonacci(n - 2); } } int main() { int n; printf("请输入一个正整数n:"); scanf("%d", &n); printf("Fibonacci数列第%d项为:%d", n, fibonacci(n)); return 0; } ``` 在上面的代码中,函数`fibonacci`使用递归的方式来计算Fibonacci数列的第n个数。如果n为0或1,则直接返回n。否则,递归地计算F(n-1)和F(n-2)的值并返回它们的和。 接下来,我们将介绍使用迭代函数来计算Fibonacci数列的方法。以下是一个使用迭代函数的示例代码: ```c #include <stdio.h> int fibonacci(int n) { int a = 0, b = 1, c, i; if (n == 0) { return a; } for (i = 2; i <= n; i++) { c = a + b; a = b; b = c; } return b; } int main() { int n; printf("请输入一个正整数n:"); scanf("%d", &n); printf("Fibonacci数列第%d项为:%d", n, fibonacci(n)); return 0; } ``` 在上面的代码中,函数`fibonacci`使用迭代的方式来计算Fibonacci数列的第n个数。我们使用三个变量a、b和c来保存前两个数和它们的和,每次循环更新它们的值,直到计算出第n个数为止。 以上是使用函数来求解Fibonacci数列的两种方法。需要注意的是,递归函数由于会重复计算一些数值,可能会比迭代函数慢一些。因此,在实际应用中,可以根据具体情况选择适合的算法

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值