汉诺塔问题:
汉诺塔问题的源于印度一个古老传说的益智玩具。大焚天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照先大后小的顺序摞着64片圆盘。大焚天命令婆罗门把圆盘从下面按大小顺序重新摆放在另一根柱子上,并且规定在小盘子上不能放大盘子,在三根柱子之间一次只能移动一个盘子。
要把A柱上的盘子全部都移动到B柱上,并且要遵循以下规则:
1、一次只能移动原著最上面的一个盘子
2、小盘子上面不能放大盘子。
将一个圆盘从一根柱子移动到另一根柱子上,算是移动一次,那么将n个盘子全部从A柱移动到B柱至少移动多少次呢?
代码实现:
//汉诺塔问题
int x= 0;
void Move(char from, char dest)//移动一个盘子,将盘子从from柱移动到dest柱
{printf("将盘子从%c柱移动到%c柱\n", from, dest);}
void Han(int n, char x, char y, char z)
{if (n == 1){Move(x, z);//如果只有一个盘子的话,就将盘子从A柱移动到C柱}else{Han(n - 1, x, z, y);//如果有多个(假设是n个)盘子的话,就先将n-1个盘子借助C柱从A柱移动到B柱Move(x, z);//将A柱剩下的一个盘子移动到C柱Han(n - 1, y, x, z);//再将B柱上的n-1个盘子借助A柱移动到C柱}
}int main()
{int num = 0;printf("请输入一个数:");scanf("%d", &num);//几层汉诺塔char A = 'A';char B = 'B';char C = 'C';Han(num, A, B, C); //将num个盘子借助B柱从A柱移动到C柱return 0;
}
其中具体代码的实现功能我都加了详细的注释。
运行结果:
如果你想要直到一共移动了多少次,可以加一个计数的变量:
汉诺塔问题在C语言中实现就是利用了函数递归的方法,将A柱上n-1个盘子借助C柱移动到B柱,然后将A柱剩下的一个盘子从A柱移到C柱,再将剩下的n-1个盘子借助A柱从B柱移动到C柱。
以上是汉诺塔问题的原理以及C语言程序,下面介绍青蛙跳台阶的问题。
青蛙跳台阶问题:
青蛙一次可以跳一个台阶,一次也可以跳两个台阶,我们要求青蛙跳n个台阶有几种跳法。
若n = 1,则存在一种跳法。(1)
若n = 2,则存在两种跳法。(1,1) (2)
若n = 3,则存在三种跳法。(1,1,1)(1,2)(2,1)
若n = 4,则存在五种跳法。(1,1,1,1)(1,1,2)(1,2,1)(2,1,1)(2,2)
若n = 5,则存在八种跳法。(1,1,1,1,1)(1,1,1,2)(1,1,2,1)(1,2,1,1)(2,1,1,1)(2,2,1)(1,2,2)(2,1,2)
从上面的例子我们可以发现一个规律:从n=2的时候,每次n增加1时,他所对定的跳法是n-1所对应的跳法加上了n-2对应的跳法。我们这时就可以把青蛙跳台阶问题看成一个类斐波那契数列求解的问题。如果对斐波那契数列求解有疑问的可以看斐波那契数列求解
程序实现:
//青蛙跳台阶的问题
//青蛙一次能跳一个或者两个台阶,求跳n个台阶能有几种跳法
int jump(int n)
{if (1 == n){return 1;}else if (2 == n){return 2;}else{return jump(n - 1) + jump(n - 2);}
}int main()
{int step = 0;printf("请输入一个数:");scanf("%d", &step);int ret = jump(step);printf("一共有%d 种跳法", ret);return 0;
}
运行结果: