建议多刷题
递归两个必要条件
1.存在限制条件
2.每次递归后越来越接近这个限制条件
3.满足以上两个条件也不一定递归成功
递归例子
1.输入一串数,挨个打印数字
void print(unsigned int n)
{
if (n > 9) //不写会导致死递归,进而栈溢出(stack overflow)
{
print( n / 10);
}
printf("%d ", n % 10);
}
int main()
{
unsigned int num = 0;
//%d是有符号整数,有正负数
//%u打印无符号整数
scanf("%u", &num);
print(num);
return 0;
}
可以理解成,当if在前printf在后时,反着输出printf的功能
2.模拟实现strlen,且不使用临时变量
int slen(char* str)
//把数组/字符串放入函数中,本质是将首字符地址传入 参数部分写成指针形式
//int slen(char str[]) 参数部分写成数组形式,也行得通
{
if (*str != '\0')
{
return 1 + slen(++str);
//str+1 可以将指针地址 + 1 ,但是写成str++就不可以
//++str可以但不推荐写,因为会改变str的值,最好写成str+1
}
else
{
return 0;
}
}
int main()
{
char arr[] = "abc"; //[a b c\0]
int len=slen(arr);
printf("%d", len);
return 0;
}
3.n的阶乘
int fac(int n)
{
if (n <= 1)
return 1;
else
return n * fac(n - 1);
}
求第n个斐波那契数
使用递归,时间复杂度2^n
//数列思想
int fib(int n)
{
if (n <= 2)
{
return 1;
}
else
{
return fib(n - 1) + fib(n - 2);
}
}
使用迭代
int fib(int n)
{
int a = 1;
int b = 1;
int c = 0;
while (n >= 3)
{
c = a + b;
a = b;
b = c;
n--;
}
return c;
}