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

本文介绍了斐波那契数列的概念,并分别展示了非递归和递归两种方法实现斐波那契数的计算。非递归方法通过循环避免了重复计算,空间效率更高;递归方法虽然简洁,但可能导致较多的函数调用和时间消耗。文章通过代码示例和运行结果对比了两种方法的优缺点。
摘要由CSDN通过智能技术生成

目录

前言:

一.非递归

1.算法思路

2.具体代码

3.运行结果

二.递归

1.算法思路

2.具体代码

3.运行结果

 三.总结


前言:

斐波那契数:
       斐波那契数亦称之为斐波那契数列、又称黄金分割数列、费波那西数列、费波拿契数、费氏数列,指的是这样一个数列:1、1、2、3、5、8、13、21、……在数学上,斐波那契数列以如下被以递归的方法定义:F0=0,F1=1,Fn=Fn-1+Fn-2(n>=2,n∈N*)。简单来说就是第一、二位之后的每个数都是它前边两个数的和。

一.非递归

1.算法思路

       建立Fib(n)函数求n的斐波那契数。因为前两位为1,而一二位数后的每个数都等于它前面两位数的和,所以我们只需要判断n是否为前两位,若为前两位则令其等于1;否则则令其等于前面两位之和。为了节省空间,我们只需要3个变量来分别存放第一位的值、第二位的值以及它们的和,后面再分别将第二位的值赋给第一位,将和赋给第二位,再求和算出新的第三位即可求出第n个斐波那契数。

2.具体代码

#include<stdio.h>

int Fib(int n) {
	if (n == 0 || n == 1) {
		return 1;
	}
	else {
		int n1 = 1, n2 = 1;
		int sum = 0;
		for (int i = 3; i <= n; i++) {
			sum = n1 + n2;
			n1 = n2;
			n2 = sum;
			
		}
		return sum;
	}
}
int main() {
	printf("请输入一个整数n:");
	int n = 0;
	scanf("%d", &n);
	printf("第n个斐波那契数是:%d\n", Fib(n));

	return 0;
}

3.运行结果

二.递归

1.算法思路

       建立Fib(n)函数求n的斐波那契数。判断n是否为前两位,如果是则返回1;如果不是则调用Fib()函数本身对它的前两个数进行相加求和。

2.具体代码

#include<stdio.h>

int fib(int n)
{
    if (n <= 2)
    {
        return 1;
    }
    else
    {
        return fib(n - 1) + fib(n - 2);
    }
}
int main()
{
    int n = 0;
    int ret = 0;
    scanf("%d", &n);
    ret = fib(n);
    printf("第n个斐波那契数为%d", ret);
    return 0;
}

3.运行结果

 三.总结

       递归的方法代码虽然少,但每次都会重复调用fib(n-1),这种方法会占用较大空间,花费较多时间。相比之下,非递归的方法只使用三个变量,占用空间较小,花费的时间也会非常少。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值