递归:自己调用自身 把大事化小
递归的两个必要条件:
递归的两个限制条件,当满足这个限制条件的时候,递归便不再继续
每次递归调用后越来越接近限制条件
先写一个最简单递归函数
int main()
{
printf("hehe\n");
main();//一直递归 栈溢出 stackoverflow
return 0;
}
练习1.接受一个整型值(无符号),按照顺序打印它的每一位。 例如:输入1234 输出1 2 3 4
void print(int n)
{
if (n > 9)
{
print(n / 10);
}
printf("%d ", n % 10);
}
int main()
{
unsigned int num = 0; //unsigned 则只能取正值,不能取负值
scanf("%d", &num);//1234
//递归
print(num);
//print(1234)
//print(123) 4
//print(12) 3 4
//print(1) 2 3 4
return 0;
}
练习2:编写函数不允许创建临时变量,求字符串的长度
//int my_strlen(char*str)
//{
// int count = 0;
// while(*str != '\0')
// {
// count++;
// str++;
// }
// return count;
//}
//递归的方式
int my_strlen(char*str)
{
if (*str != '\0')//没有创建临时变量
return 1 + my_strlen(str + 1); //向下传递 向上返回
else
return 0;
}
//把大事化小
//my_strlen("bit")
//1+my_strlen("it")
//1+1+ my_strlen("t")
//1+1+1+ my_strlen("")
//1+1+1+0
//3
int main()
{
char arr[] = "bit";
//int len = strlen(arr);//求字符串长度
//printf("%d\n", len);
//模拟实现一个strlen函数
int len = my_strlen(arr);//arr是数组,数组传参,传过去的不是整个数组,而是第一个元素的地址
printf("%d\n", len);
return 0;
}
练习3.求n!
int Fac1(int n)
{
int i = 0;
int ret = 1;
for (i = 1; i <= n; i++)
{
ret = ret * i;
}
return ret;
}
int main()
{
int i = 0;
int n = 0;
scanf("%d", &n);
int ret =Fac1(n);//循环的方式
printf("%d\n", ret);
return 0;
}
递归的方法
Fac(n) n<=1 1 n>1 n*Fac(n-1)
int Fac2(int n)
{
if (n <= 1)
return 1;
else
return n * Fac2(n - 1);
}
int main()
{
int i = 0;
int n = 0;
scanf("%d", &n);
int ret = Fac2(n);//循环的方式
printf("%d\n", ret);
return 0;
}