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

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

专注于为中小企业提供成都做网站、网站建设服务,电脑端+手机端+微信端的三站合一,更高效的管理,为中小企业河东免费做网站提供优质的服务。我们立足成都,凝聚了一批互联网行业人才,有力地推动了数千家企业的稳健成长,帮助中小企业通过网站建设实现规模扩充和转变。

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

斐波那契数列

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

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

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

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

(一)函数递归的方法(有缺点,但是易理解)
//不考虑溢出
#includeint 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;
}

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

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

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

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

#includeint 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值便可以知道仅第三个数就调用了大量多次。

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

(二)非函数递归的方法
#includeint 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#includeint 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#includeint 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

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

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

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

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

你是否还在寻找稳定的海外服务器提供商?创新互联www.cdcxhl.cn海外机房具备T级流量清洗系统配攻击溯源,准确流量调度确保服务器高可用性,企业级服务器适合批量采购,新人活动首月15元起,快前往官网查看详情吧


文章标题:【C语言】通过解题进一步理解并联系函数递归(斐波那契数列)-创新互联
文章地址:http://ybzwz.com/article/dihshs.html