函数递归
1.什么是递归
程序调用自身是递归
一个最简单的递归
int main()
{
printf("hehe\n");
main();
return 0;
}
会一直打印hehe,但是会因为栈溢出而停止;
每次调用函数都用在栈区申请空间,所以会导致栈溢出
练习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;
scanf("%d",&num);
//递归
print(num);
return 0;
}
练习2求字符串长度
#include<string.h>
int my_strlen(char* str)
{
int count = 0;
while(*str != '\0')
{
count++;
str++;
}
return count;
}
int main()
{
char arr[] ="whu shangan";
int len = my_strlen(arr);//arr是数组,数组传参,传过去的不是整个数组,而是第一个元素的地址
printf("len = %d\n",len);
return 0;
}
int my_strlen(char* str)
{
if(*str != '\0')//注意此时的str是第一个元素的地址
//*str就是表示解引用,就是第一个数组元素w
return 1+my_strlen(str+1);//str+1表示下第二个数组元素的地址
else
return 0;
}
int main()
{
char arr[] ="whu shangan";
int len = my_strlen(arr);//arr是数组,数组传参,传过去的不是整个数组,而是第一个元素的地址
printf("len = %d\n",len);
return 0;
}
递归的主要思考方式在于:把大事化小
2.递归与迭代
练习:求一个数的阶乘
int Fac(int n)
{
if(n<=1)
return 1;
else
return n*Fac(n-1);
}
int main()
{
int n = 0;
int ret = 0;
scanf("%d",&n);
ret = Fac(n);
printf("%d\n",ret);
return 0;
}
练习:求斐波那契数列
斐波那契数列:前两个数之和等于第三个数
1 1 2 3 5 8 13 21 34 55…
int Fib(int n)
{
int a = 1;
int b = 1;
int c = 1;
while(n>2)
{
c = a*b; //可以保证不重复
a = b;
b = c;
n--;
}
return c;
}
int main()
{
int n = 0;
int ret = 0;
scanf("%d",&n);
ret = Fib(n);
printf("%d",ret);
return 0;
}