【C语言】通过解题进一步理解并联系函数递归(斐波那契数列)

关于函数递归,我认为应该是C语言函数板块中比较难理解以及需要多训练的板块了。

在本篇文章中,我将通过解答斐波那契数列问题,进一步阐述函数的递归。

斐波那契数列

维基百科中对斐波那契数列的解释为:

 通俗一点讲就是一组数列,前两个数都为1,从第三个数开始,前两个数之和为下一个数的值。

即1,1,2,3,5,8,13,21,34,55,89……

本文将介绍三种方式对其进行解答

(一)函数递归的方法(有缺点,但是易理解)

//不考虑溢出
#include<stdio.h>
int num(int x)
{
	if (x == 3)
	{
		count++;
	}
	if (x < 3)
	{
		return 1;
	}
	else
	{
		return (num(x-1) + num(x -2));
	}
}
int main()
{
	int a = 0;
	scanf_s("%d", &a);
	printf("%d\n", num(a));
	return 0;
}

通过输入一些不大的整型数字,可以验证这种写法是正确的。

但是当输入一些数值较大的数时就会发现,程序运行时间很长,并且在输入更大数字时,会出现程序崩溃的现象。

是因这种程序写法十分繁杂,过程很繁琐,并且多次重复运用调用。

我们可以改动代码验证这个假想

#include<stdio.h>
int count = 0;
int num(int x)
{
	if (x == 3)
	{
		count++;
	}
	if (x < 3)
	{
		return 1;
	}
	else
	{
		return (num(x-1) + num(x -2));
	}
}
int main()
{
	int a = 0;
	scanf("%d", &a);
	printf("%d\n%d\n", num(a),count);
	return 0;
}

输出count值便可以知道仅第三个数就调用了大量多次。

所以我们可以采用不递归的方法进行编写程序

(二)非函数递归的方法

#include<stdio.h>
int num(int x)
{	
	int y = 1;
	int z = 1;
	int r = 0;
	int c = 0;
	if (x < 3)
	{
		return 1;
	}
	else
	{
		while (c<(x-2))
		{
			r = y;
			y += z;
			z = r;
			c++;
		}
		return y;
	}
}
int main()
{
	int a = 0;
	scanf("%d", &a);
	printf("%d\n", num(a));
	return 0;
}

在这个程序写法中就并非利用了函数递归的方法,而是采用了循环语句,使得程序更加简单并且可行性提高。

(三)维基百科上的采用C语言对于斐波那契数列的解法

作者在搜索斐波那契数列在维基百科上的注释时,注意到维基百科对于斐波那契数列在C语言程序编写中,进行了介绍。

1.通项公式法

#include <stdio.h>
#include <math.h>

int main()
{
    int n;
    double constant_a = (1 + sqrt(5)) / 2;
    double constant_b = (1 - sqrt(5)) / 2;
    double constant_c = sqrt(5) / 5;
    double value_1 = 0;
    int value_2 = 0;
    scanf("%d", &n);
    if(n > 0)
    {
        for (int i = 0; i < n; i++)
        {
             value_1 = constant_c * (pow(constant_a, i) - pow(constant_b, i));
             value_2 = (int)value_1;
             printf("%d\n", value_2);
        }
        return 0;
    }
    else
    {
        return -1;
    }
}

2.阵列版

#include <stdio.h>
#include <stdlib.h> 
int main()
{   
     int n,s,L;
     printf("輸入長度");
     scanf("%d",&L);
     while(L<0)
     {
     	printf("錯誤"); 
     	return 0;
	 }
     int a[L]; 
     int x=1,y=2;
     a[0]=x;
     a[1]=x;
     a[2]=y;
	 for(n=3;n<L;n++)
	 {  
		 a[n]=a[n-1]+a[n-2];  	
	 }
       for(n=0;n<L;n++)
     {
         printf("%d ",a[n]);
     }
     system("pause");
     return 0;
}

如果读者学有余力的话,可以再次深入了解这两段程序的写法,可以进一步熟知这个知识点,加深印象。

通过对斐波那契数列程序的编写,相信大家进一步理解了C语言函数递归的知识点了,多加练习,方能熟练。“无他,惟手熟尔”。

个人愚见,望交流学习!! 转载请注明出处

学习是一个需要不断进步不断前进的过程!!希望作者能与读者一起坚持向前!!

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值