C语言第十课:递归函数
案例一
#include <stdio.h>
//求某数阶乘
int factorial(int n)
{
int result;
if (n<0)
{
printf("输入错误!");
return 0;
}
else if (n==0||n==1)
{
result = 1;
}
else
{
result = factorial(n - 1)*n;
}
return result;
}
int main()
{
int n;
printf("要求阶乘的数:\n");
scanf_s("%d", &n);
printf("结果为:%d", factorial(n));
return 0;
}
案例二
#include <stdio.h>
/*小明为了学好英语,需要每天记单词。
第一天记1个,第二天记2个依次类推,
求到第n天的时候小明一共记了的单词总数。*/
int words(int n)
{
int sum;
if (n=1)
{
return 1;
}
else
{
sum = words(n - 1) + n;
}
return sum;
}
int main()
{
int n;
printf("学单词天数:\n");
scanf_s("%d", &n);
printf("一共学会了%d个单词。", words(n));
return 0;
}
回顾案例
在第六课:switch分支语句中用递归函数的方法计算天数同时引出注意事项。
#include <stdio.h>
int monthday(int year,int month)
{
int days;
if (month==0)
{
return 0;
}
else if (month==1){days = 0;}
else if (month == 2)
{
if ((year % 400 != 0)&(year % 4 == 0))
{
days = 29;
}
else
{
days = 28;
}
}
else if (month==3){days = 31;}
else if (month == 4){days = 30;}
else if (month == 5){days = 31;}
else if (month == 6){days = 30;}
else if (month == 7){days = 31;}
else if (month == 8){days = 31;}
else if (month == 9){days = 30;}
else if (month == 10){days = 31;}
else if (month == 11){days = 30;}
else{days = 31;}
return days+= monthday(year,month - 1);
}
int main()
{
int year, month, day;
printf("输入要计算的日期:");
scanf_s("%d.%d.%d", &year,&month, &day);
printf("该日期是%d年的第%d天", year,monthday(year,month)+day);
return 0;
}
注意事项
上述计算天数案例中,在使用递归函数调用自身的时候,不能直接用以下方式定义月份的天数:
if (month==0)
{
return 0;
}
else if (month==1){days = 0;}
else if (month == 2)
{
if ((year % 400 != 0)&(year % 4 == 0))
{
days = 29;
}
else
{
days = 28;
}
}
else if (month==3,5,7,8,10,12){days = 31;}
else{days = 31;} //!!!错误方式
return days+= monthday(year,month - 1);
因为递归函数严格按照顺序调用,正如案例一中求阶乘,假设n=5时,便是按照下图顺序运行:
要点
- 每一级函数调用时都有自己的变量,但是函数代码并不会得到复制,如计算5的阶乘时每递推一次变量都不同;
- 每次调用都会有一次返回,如计算5的阶乘时每递推一次都返回进行下一次;
- 递归函数中,位于递归调用前的语句和各级被调用函数具有相同的执行顺序;
- 递归函数中,位于递归调用后的语句的执行顺序和各个被调用函数的顺序相反;
- 递归函数中必须有终止语句。如:上述计算天数若无当month==0时return 0将会逻辑错误;
一句话总结递归:自我调用且有完成状态。