函数自身调用自身的操作,称为函数的递归操作!
一般递归存在两个条件:
1.递归的起始值( 需要看具体问题)
2.递归的结束条件( 一定得有)
具体参考以下案例:
1.有五个人坐在一起,问第5个人多少岁?他说比第4个人大2岁。
问第4个人岁数。他说比第3个人大2岁。
问第3个人,又说比第2个人大2岁。
问第2个人,说比第一个人大2岁。
最后问第一个人,他说是10岁。
请问第 5 个人多大?
#include <stdio.h>
int Fun(int n);
int main()
{
int n=0;
printf("请输入第几个人:\n");
scanf("%d",&n);
int age=Fun(n);
printf("age=%d\n",age);
return 0;
}
int Fun(int n)
{
int age=0;
if(n==1)
{
age=10;
}
else
{
age=Fun(n-1)+2;//函数的递归
}
return age;
}
可以看到代码:age=Fun(n-1)+2;
当输入为n=5时,执行else语句中的 age=Fun(n-1)+2;此时为age=Fun(4)+2;而Fun(4)再次调用Fun函数,即n=4;
当n=4时,age=Fun(3)+2;->n=3,age=Fun(2)+2;->n=2,age=Fun(1)+2;->n=1,此时执行if(n==1)语句,得age=10;
返回到age=Fun(1)+2;等价于age=10+2=12;返回return;
返回到age=Fun(2)+2;等价于age=12+2=14;返回return;
返回到age=Fun(3)+2;等价于age=14+2=16;返回return;
返回到age=Fun(4)+2;等价于age=16+2=18;返回最后得return age,得到age=18.
参考下图:
运行结果:
请输入第几个人:
5
age=18
2.用递归方法求n!。
#include <stdio.h>
/*
用递归方法求n!。
*/
int Fun(int n);
int main()
{
int n=0;
printf("请输入n:\n");
scanf("%d",&n);
int num=Fun(n);
printf("%d!=%d\n",n,num);
return 0;
}
int Fun(int n)
{
int num=n;
if(n>1)
{
num*=Fun(n-1);
}
else if(n==0)//考虑到n可能为0的情况
{
num=1;
return num;
}
else
{
return num;
}
}
运行结果:
请输入n:
5
5!=120
请输入n:
0
0!=1
3.递归实现字符串逆序输出
//递归逆序输出字符串
#include <stdio.h>
void Fun(char *p);
int main()
{
char buf[32] = {0};
gets(buf);//"hello"
Fun(buf);
return 0;
}
void Fun(char *p)
{
if(*p == '\0')
{
return;
}
else
{
Fun(p+1);
printf("%c",*p);
}
}
另一种更复杂的写法:
#include <stdio.h>
#include <string.h>
/*递归实现字符串逆序输出*/
void SwapFun(char *p);
int main()
{
char buf[32]={0};
printf("请输入字符串:\n");
scanf("%s",buf);
getchar();
SwapFun(buf);
printf("逆序输出:%s\n",buf);
return 0;
}
void SwapFun(char *p)
{
char tmp=*p;
int n=strlen(p);
*p=*(p+n-1);
*(p+n-1)='\0';
if(strlen(p+1)>=2)
{
SwapFun(p+1);
}
*(p+n-1)=tmp;
return;
}
运行结果:
请输入字符串:
hello
逆序输出:olleh
标签:return,函数,递归,int,age,char,Fun,操作
From: https://blog.csdn.net/2401_83703513/article/details/137292519