c语言函数递归思路+经典例题解析

(i)函数的递归要满足的条件

1.递归要有进入函数条件和跳出条件(限制条件)
2.每次递归都要逼近限制条件
//条件1、2是程序员设置的
*3.函数递归不会栈溢出

一、函数递归思路分享

(1)数学递归公式思想的发散与推广

a.先通过简单的枚举,看看只有一两个的时候,函数是怎么样递归的,例如有n个数的时候,先看看n=1和n=2时候的值是多少!(就相当于设置了跳出条件)
b.接着把n看成 n=n-1 + 1,在函数fun(n)的递归中就将fun(n-1)传值就好了
//相当于每次递归都会逼近跳出递归的条件
c.最后试着找出fun(n)与fun(n-1)、fun(n-2)之间的关系

(2)大事化小

核心:将复杂的问题一次一次的剥成一件件简单且思路相同的事情

二、经典例题代码思路分享(代码中有思路)

(1)裴波那切数列

函数递归求裴波那契数列的底n项值//1 1 2 3 5 8 13 21 34 55……
int fun(int n)
{
	if (n == 1 || n == 2)
	{
		return 1;
	}
	else
	{
		return fun(n - 1) + fun(n - 2);//就是fun(n)=fun(n-1)+fun(n-2)
	}
}
int main()
{
	int n;
	scanf("%d", &n);
	int ret=fun(n);
	printf("第%d个数的值为%d\n", n, ret);
	return 0;
}

(2)汉诺塔问题

汉诺塔问题
void honis(int n, char a, char b, char c)
{
	if (n == 1)
	{
		printf("%c-->%c\n", a, c);//将一个汉诺塔从a移动到c
	}
	else
	{
		honis(n - 1, a, c, b);//先将最上层的汉诺塔一道b柱子上
		printf("%c-->%c\n", a, c);//接着将a柱子上的汉诺塔移到c上
		honis(n - 1, b, a, c);//最后将b柱子上的汉诺塔通过a移到c柱子上
	}
}
int main()
{
	printf("请输入有几个汉诺塔:");
	int n;
	scanf("%d", &n);
	printf("%d\n", n);
	honis(n, 'a', 'b', 'c');//就是将a柱子上的汉诺塔通过b移动到c柱子上
}

(3)青蛙跳台阶

//青蛙跳台阶
int frog_jumps_steps(int n)
{
	if (n == 1 || n == 0)//规定1  0个台阶就只有一种跳法
	{
		return 1;
	}
	else if (n == 2)//青蛙可以下子跳一个或两个台阶,所以有两种跳法
	{
		return 2;
	}
	else
	{
		return frog_jumps_steps(n - 2) + frog_jumps_steps(n - 1);
	}
}
int main()
{
	printf("请输入有几个台阶:");
	int n;
	scanf("%d", &n);
	int ret = frog_jumps_steps(n);
	printf("一共有%d种跳法\n", ret);
	return  0;
}

(4)字符串逆序(递归实现)(函数)——大事化

/*
递归方式:
对于字符串“abcdefg”,递归实现的大概原理:
  1. 交换a和g,
  2. 以递归的方式逆置源字符串的剩余部分,剩余部分可以看成一个有效的字符串。
  3. 再以类似的方式逆置
*/
void reverse_string(char* arr)
{
	int len = strlen(arr);
	char tmp = *arr;
	*arr = *(arr+len-1);
 
	*(arr+len-1) = '\0';
	if(strlen(arr+1)>=2)
		reverse_string(arr+1);
 
	*(arr+len-1) = tmp;
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

杰深入学习计算机

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值