函数的递归操作

函数自身调用自身的操作,称为函数的递归操作!
一般递归存在两个条件:
        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

  • 14
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值