关于函数递归,我认为应该是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语言函数递归的知识点了,多加练习,方能熟练。“无他,惟手熟尔”。
个人愚见,望交流学习!! 转载请注明出处
学习是一个需要不断进步不断前进的过程!!希望作者能与读者一起坚持向前!!