一、汉诺塔问题
汉诺塔问题:有A、B、C三根柱子,最初A上有n个圆盘,自下而上盘子由大到小放置,要求将A上的圆盘按照原样移动到C柱上,每次只能移动一个圆盘,且在B柱或C柱上边的圆盘依旧按照自下而上盘子由大到小放置。
思路:将A柱上的n-1个圆盘移到B柱上,再将A柱上的最后一个圆盘移到C柱上,最后一步将B柱上的n-1个圆盘移到C柱上。这样即完成了任务。但是如何将A柱上的n-1个圆盘按照自下而上由大到小放置在B柱上呢?
这里我们可以将A柱上的n-1个圆盘按照自下而上由大到小放置在B柱上的问题看做是一个新的汉诺塔问题。即需将A柱上的n-1个圆盘按照自下而上由大到小方式移动到B柱上(此时B柱就相当于原来的C柱)。这里也恰好满足递归的思想,将大型复杂的问题层层简化为与原问题相似的规模较小的问题。
int i = 0;//在这里定义一个全局变量记录移动步骤
void move(char x, char y) {
printf("第%d步:%c---->%c上\n",++i, x, y);
//i++表示先赋值再加一,(++i)则表示先加一再赋值
}
void mind(int x,char A, char B, char C) {
if (x == 1) {
move(A, C);
}
else {
mind(x - 1, A, C, B);//将A上的x-1个盘子从A移至B(以B作为中介)
move(A, C);//将A上剩下的一个盘子移至C
mind(x - 1, B, A, C);//再将B上的x-1个盘子移至C
}
}
int main() {
int sum = 0;
scanf("%d", &sum);
mind(sum,'A', 'B', 'C');
return 0;
}
二丶青蛙跳台阶问题
青蛙跳台阶问题:青蛙一次能跳上一个台阶,也能一次跳上两个台阶。问青蛙跳上n级台阶共有多少种跳法?
思路:只有一级台阶时,青蛙只有一种跳法,有两级台阶时,青蛙有两种跳法。将这两种情况视为最简单的两种情况,当台阶数大于2时,就采用递归,层层简化。
int jump(int x) {
if (x == 1) //台阶只有一个时只有一种跳法
return 1;
if (x == 2)//台阶只有两个时有两种跳法
return 2;
return jump(x - 1) + jump(x - 2);//这里求和是求出跳一步和跳两步的总共情况
}
int main() {
int a = 0;
scanf("%d", &a);
int sum = jump(a);
printf("共有%d种跳法\n", sum);
return 0;
}
如有指正,请私信我纠正