0
点赞
收藏
分享

微信扫一扫

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

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

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

斐波那契数列

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

【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语言对于斐波那契数列的解法

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语言函数递归的知识点了,多加练习,方能熟练。“无他,惟手熟尔”。


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

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

举报

相关推荐

0 条评论