一.递归含义
1.递归,就是在运行的过程中调用自己。
2.构成递归需具备的条件:
(1)递归不能是死递归,需要有判断条件,且每次递归都要更靠近结果
(2)子问题与原始问题为同样的事,且越来越简单
二.入门递归题目分析
1.递归拆数字
void print(int n)
{
if (n > 9)
{
print(n / 10);
}
printf("%d ", n % 10);
}
//分析: print(1234)==print(123)+printf(4)==print(12)+printf(3)+printf(4)
2. 递归求字符串长度
int my_strlen(char* arr)
{
if (*arr != '\0')
{
return 1+my_strlen(arr+1); //return 的时候不要把+1给忘了
}
else
{
return 0;
}
}
//分析: my_strlen("abc")=1+my_strlen("bc")=1+1+my_strlen("c")···=1+1+1+my_strlen("\0")
3.递归逆序数组
void swap(char* px, char* py)
{
char tmp=0;
tmp = *px;
*px = *py;
*py = tmp;
}
void reverse(char* arr ,int left,int right)
{
swap(&arr[left], &arr[right]);
if (left < right)
{
if ((left + right == strlen(arr) - 1)&&(right-left==1))
{
goto a;
}
reverse(arr ,left+1 ,right-1);
a:
;
}
}
//分析: reverse("abcdefg")==(交换a,g)+reverse("bcdef")=...
4.递归求各位位数之和
int DigitSum(int n)
{
if (n > 9)
return DigitSum(n / 10) + n % 10;
else
return n;
}
//分析:DigitSum(1234)=DigitSum(123)+4=DigitSum(12)+3+4=...
5.递归求n的k次方
double Pow(int n, int k)
{
if (k > 0)
{
return n * Pow(n, k - 1);
}
else if (k == 0)
{
return 1;
}
else
{
return 1.0/Pow(n,-k);
}
}
//分析:n*n*n...=n*Pow(n,k-1)
6. 递归走台阶
int fib(int n)
{
if (1 == n)
{
return 1;
}
else if (2 == n)
{
return 2 ;
}
else
{
return fib(n - 1) + fib(n - 2);
}
}
int main()
{
int n = 0;
scanf("%d", &n);
int m = fib(n);
printf("%d\n", m);
return 0;
}
//分析:假设10个台阶 则 fib(10)= fib(9) + fib(8) 等于走一步+fib(9)和走两步+fib(8)
// fib(n)=1 (n=1); fib(n)=2 (n=2);fib(n)=fib(n-1)+fib(n-2) (n>2)
三.总结
递归对初学者来讲可能会比较难想,需要多加练习,熟练之后发现递归往往能把复杂问题变得简单。