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)个盘子就是递归对象。
-------------------------------------------------------------------------------------
代码:
//汉诺塔问题-- 求需要移动多少次
//n-1 个盘子:移动(2^(n-1))-1 次
#include<stdio.h>
#include<math.h>
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)级台阶问题,重复相同的工作---递归
-----------------------------------------------------------------------------
代码:
//青蛙跳台阶问题:求方法数
//除0 1 2台阶外都是满足菲波那切数列
#include<stdio.h>
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;
}
----------------------一个人所有的愤怒都来源于对自己无能的痛苦。-------------------------