函数递归经典题型

1、汉诺塔问题

该游戏是在一块铜板装置上,有三根杆(编号A、B、C),在A杆自下而上、由大到小按顺序放置64个金盘(如下图)。游戏的目标:把A杆上的金盘全部移到C杆上,并仍保持原有顺序叠好。操作规则:每次只能移动一个盘子,并且在移动过程中三根杆上都始终保持大盘在下,小盘在上,操作过程中盘子可以置于A、B、C任一杆上。

分析:对于这样一个问题,任何人都不可能直接写出移动盘子的每一步,但我们可以利用下面的方法来解决。设移动盘子数为n,为了将这n个盘子从A杆移动到C杆,可以做以下三步:

(1)以C杆为中介,从A杆将1至n-1号盘移至B杆;

(2)将A杆中剩下的第n号盘移至C杆;

(3)以A杆为中介;从B杆将1至n-1号盘移至C杆。 

------------------------------------------------------------------------------------

思路:有一个中介,借助目标杆,先将(n-1)个盘子放到中介上,另一个盘子放到目标杆上;

即:那(n-1)个盘子就是递归对象。

函数递归经典题型_第1张图片

-------------------------------------------------------------------------------------

代码:

//汉诺塔问题-- 求需要移动多少次
//n-1 个盘子:移动(2^(n-1))-1 次

#include
#include

int ToH(int n)
{
	if (n > 0)
	{
		return (1 + 2 * ToH(n - 1));
	}
	return (pow(2.0,(double)(n-1.0))-1);
}
int main()
{
	int n = 0;
	printf("请输入盘子个数n:\n");
	scanf("%d", &n);
	//汉诺塔
	int ret = ToH(n);
	printf("ToH(%d)=%d\n", n, ret);
	return 0;
}

-------------------------------------------------------------------------------------

2、青蛙跳台阶问题

一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法(先后次序不同算不同的结果)。

----------------------------------------------------------------------------

思路:同样分为第一级台阶和余下的(n-1)级台阶问题,重复相同的工作---递归

函数递归经典题型_第2张图片 

-----------------------------------------------------------------------------

代码:

//青蛙跳台阶问题:求方法数
//除0 1 2台阶外都是满足菲波那切数列

#include
int Stage(int n)
{
	if (0 == n)
	{
		return 0;
	}
	else if (1 == n)
	{
		return 1;
	}
	else if (2 == n)
	{
		return 2;
	}
	else
	{
		return (Stage(n - 1) + Stage(n - 2));
	}
}
int main()
{
	int n = 0;
	printf("请输入台阶数n:\n");
	scanf("%d", &n);
	//递归
	int ret = Stage(n);
	printf("Kind(%d)=%d\n", n, ret);
	return 0;
}

----------------------一个人所有的愤怒都来源于对自己无能的痛苦。------------------------- 

你可能感兴趣的:(Note-C语言,蓝桥杯,职场和发展,c语言,汉诺塔,青蛙跳台阶)