今天学习了函数的调用以及递归,函数可以让我们的代码看起来有条理,主函数没有很多冗余的东西,但是在调用的时候也要注意一些小细节。第二个就是递归了,递归就是函数自己调用自己,在使用递归的时候需要我们对于题目先行理解,处理好逻辑关系,这样在写代码时也可以避免很多不必要的错误。在写练习的时候也会遇到一些小问题,比如栈溢出,未编写跳出条件等问题。
典型问题:栈溢出问题
下面编写的代码是由问题的,由于每递归一次函数都需要在栈内部开辟一个内存单元,因此递归达到一定的次数时,就会出现内存单元不够的问题,这就是栈溢出问题。这也是我们编写代码时需要注意的一个问题点,采用合适的方法达到目的。
void test(int n)
{
if(n<10000)
{
test(n+1);
}
}
int main()
{
test(1);
system("pause");
return 0;
}
例:寻找斐波那契数
方法一:使用函数递归来实现斐波那契数的查找
使用递归的方法虽然可以解决问题,但是一直在函数内部做多余的重复操作,效率十分低下。
int num(int n)
{
if(n==1||n==2)
{
return 1;
}
else if(n>2)
{
return num(n-1)+num(n-2);
}
}int main()
{
int i=1;
printf("请输入想查找的第几位斐波那契数:");
scanf("%d",&i);
printf("%d\n",num(i));system("pause");
return 0;
}
方法二:使用while循环
使用while循环实现首先需要对于题目本身进行理解,理清逻辑,再进行编写代码,这样的方法可以更加高效的去完成任务,相比于递归方式来说有着很大的优势。
int num(int n)
{
int a=1,b=1,c=1;
while(n>2)
{
c=a+b;
a=b;
b=c;
n--;
}
return c;
}
int main()
{
int i=1;
printf("请输入想查找的第几位斐波那契数:");
scanf("%d",&i);
printf("%d\n",num(i));system("pause");
return 0;
}
总结:综合今天练习的几道题目来说,函数递归是一种很方便的代码编写方式,但是还是需要我们自己对于题目理解,最终选择出最优方案,并不能将递归当做唯一的方式。