(C语言)教你学会递归(含汉诺塔等递归问题)

递归就是在函数中调用本身这个函数。

写出递归最主要的是列出递归公式

我们先来看一个简单的问题

求n的阶乘

我们可以列出递归公式

当n=1时,函数的结果(返回值)等于1;于是就可以很快的写出递推公式了。

int jiecheng(int n)
{
	if (n = 1) return 1;
	else
		return jiecheng(n - 1) * n;

}

斐波那契数列

指的是这样一个数列:1,1,2,3,5,8,13,21,34,55,89...

这个数列从第3项开始,每一项都等于前两项之和。

求写出这个数列的第n项。

写出递归最主要的是列出递归公式

我们可以很清楚的得到,当n=1或者2时,函数的结果(返回值)等于1;于是就可以很快的写出递推公式了。


int fbnc(int n)
{
	int a = 0;
	if (n == 1)
		return 1;
	if (n == 2)
		return 1;
		else
		return fbnc(n - 1) + fbnc(n - 2);
}

汉诺塔问题

给定三根柱子,记为 A,B,C ,其中 A 柱子上有 N 个盘子,从上到下编号为 0 到 N−1 ,且上面的盘子一定比下面的盘子小。问:将 A 柱上的盘子经由 B 柱移动到 C 柱最少需要多少次?

​ 移动时应注意:

① 一次只能移动一个盘子

​ ②大的盘子不能压在小盘子上

假设总共需要移动n个盘子
1.将A柱上的n-1个盘子借助C柱移向B柱
2.将A柱上仅剩的最后一个盘子移向C柱
3.将B柱上的n-1个盘子借助A柱移向C柱

我们一样列出递推公式

当我们移动一次,将移动的字符进行打印,可以设置一个全局变量移动一次后将变量+1,可以计算出要的步数;

int x = 0;
void hanuo(int n,char a,char b,char c)
{
	if (n == 1)  x += 1,printf("%c->%c ", a, c);
	else
	{
		hanuo(n - 1, a, c, b);
		x += 1, printf("%c->%c ", a, c);
		hanuo(n - 1, b, a, c);
	}
}

代码就实现啦!!!

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值