递归就是在程序运行的过程中调用自己。
构成递归需具备的条件:
1. 子问题须与原始问题为同样的事,且更为简单;
2. 不能无限制地调用本身,须有个出口,化简为非递归状况处理。
递归的模板:
我们知道递归必须满足两个条件:1.必须调用自己;2.必须有结束的出口,而且一般我们会将终止条件写在调用的前面。
public void recursion(参数0) {
if (终止条件) {
return;
}
recursion(参数1);
}
如果我们将终止条件写在调用的后面,那终止条件将不会得到执行,因为前面的调用自身会无限的调用,从而造成栈溢出(stackoverflow),如下是错误的写法:
public void recursion(参数0) {
recursion(参数1);
if (终止条件) {
return;
}
}
递归常见的习题:
1.求阶乘
#include <stdio.h>
int jiecheng(int num);
int main()
{
int number;
scanf("%d",&number);
printf("%d",jiecheng(number));
getch();
return 0;
}
int jiecheng(int num){
int j=1;
if(num==1)
return j;
j=num*jiecheng(num-1);
}
2.打印i-j
#include <stdio.h>
int dayin(int num1,int num2);
int main()
{
int number1,number2;
scanf("%d %d",&number1,&number2);
dayin(number1,number2);
getch();
return 0;
}
int dayin(int num1,int num2){
if(num1>num2)
return 0;
printf("%d ",num1);
dayin(num1+1,num2);
}
3.数组的累加
#include <stdio.h>
int leijia(int a[],int begin2);
int main()
{
int a[10]={11,22,33,44,55,66,77,88,99,100},begin1=0;
printf("%d",leijia(a,begin1));
getch();
return 0;
}
int leijia(int a[],int begin2){
int j=0;
if(begin2==9)
return j;
j=a[begin2]+leijia(a,begin2+1);
}
4.反转字符串
#include<stdio.h>
int my_strlen(char *str)
{
if(*str == '\0')
return 0;
else
return 1+ my_strlen(str+1);
}
void reverse_string(char *string)
{
int len = my_strlen(string);
if(len <= 1)
return ;
else
{
char temp = string[0];
string[0] = string[len-1];
string[len-1] = '\0';
reverse_string(string+1);
string[len-1] = temp;
}
}
int main()
{
char ch[] = "abcdefghijklmno";
reverse_string(ch);
printf("%s ",ch);
printf("\n");
getch();
return 0;
}