一、汉诺塔问题
/*汉诺塔是什么?
/*
汉诺塔(又称河内塔)问题是源于印度一个古老传说的益智玩具。大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘。大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。
规定,在小圆盘上不能放大圆盘,在三根柱子之间一次只能移动一个圆盘。
*/
/*第一步:
将
把第n个模块,从塔1移动到塔3
第二步:
把n-1个模块,从塔2移动到塔3
*/
//用递归解决汉诺塔问题:
//定义 塔1:Tower1 塔2:Tower2 塔3:Tower3
/*
#include <stdio.h>
int cnt;//计算步数
void Remove(int n,char A,char B,char C)
{
if (n == 1)
printf("step %d: 塔%c --> 塔%c\n", cnt++, A, C);
else
{
Remove(n - 1, A, C, B);
printf("step %d: 塔%c --> 塔%c\n", cnt++, A, C);
Remove(n - 1, B, A, C);
}
}
int main()
{
int n;
cnt = 1;
printf("请输入汉诺塔圆盘数量>:");
scanf("%d", &n);
Remove(n, 'A', 'B', 'C'); //圆盘数量 塔A, 塔B, 塔C
return 0;
}
*/
#include <stdio.h>
void move(int n,char A,char B,char C);
int cnt=1;
void move(int n,char A,char B,char C)
{
if(n==1) //最后一步(n步)就是把第一个柱子的圆盘放到最后一个柱子
{
printf("第%d步:将一个圆盘从%c柱子->%c柱子\n",cnt++,A,C);
}
else
{
move(n-1,A,C,B); //把A上n-1个盘子通过借助辅助塔(C塔)移到了B上
printf("第%d步: 将一个圆盘从%c柱子->%c柱子\n",cnt++,A,C); //把最大的一个盘子由A移到C上去
move(n-1,B,A,C); //把B上n-1个盘子通过借助辅助塔(A塔)移到了C上
}
}
int main()
{
int n = 0;
char A = 'A';
char B = 'B';
char C = 'C';
printf("请输入圆盘的个数:\n");
scanf("%d",&n);
move(n,A,B,C);
return 0;
}
二、青蛙跳台阶
//问题:
//有一只青蛙,一次可以跳一层台阶也可以跳两层台阶,问n层台阶共有多少种跳法?
/*
问题分析:
1层 <| 跳1步 1种
| 跳1步->跳1步
2层 < 2种
| 跳2步
| 跳1步->跳1步->跳1步
3层 <| 跳1步->跳2步 3种
| 跳2步->跳1步
| 跳1步->跳1步->跳1步->跳1步
| 跳1步->跳1步->跳2步
4层 <| 跳1步->跳2步->跳1步 5种
| 跳2步->跳1步->跳1步
| 跳2步->跳2步
| 跳1步->跳1步->跳1步->跳1步->跳1步
| 跳1步->跳1步->跳1步->跳2步
| 跳1步->跳1步->跳2步->跳1步
5层 <| 跳1步->跳2步->跳1步->跳1步 8种
| 跳2步->跳1步->跳1步>跳1步
| 跳2步->跳1步->跳2步
| 跳2步->跳2步->跳1步
| 跳1步->跳2步->跳2步
:
:
:
:
n层 f(n)=f(n-1)+f(n-2) 种
*/
#include<stdio.h>
int Move(int n);
int main()
{
int n = 0;
printf("请输入有多少层台阶\n");
scanf("%d",&n);
printf("小青蛙有%d种跳法",Move(n));
}
int Move(int n)
{
int cnt;//计数
if(n<=3)
{
cnt = n; //台阶数在3层以内时, 多少层就有多少种跳法
}
else
{
cnt=Move(n-1)+Move(n-2);//台阶在3层以外, 跳的次数就等于前两次次数的和
}
return cnt;
}
//程序运行流程:
/*
例如: 输入4
n = 4 ;
判断n >3 所以进else
cnt =Move(3)+Move(2)
3 和 2 都在三层内
所以 进入if,即层数就是跳法数
cnt = 3+2 = 5;循环结束;
返回 5;
例如 输入5
n = 5;
进入第一层Move:
判断 n>3 所以进else
cnt = Move(4)+Move(3)
>>>>执行递归:
进入第二层Move
Move(4):n>3 所以还是 进入else 即cnt = Move(3)+Move(2)
进入第三层Move
Move(3) :n = 3 进入if 判断 满足if条件,所以 cnt = n 返回 3到上一层 即 第二层Move
Move(2) :n = 2 进入if 判断 满足if条件,所以 cnt = n 返回 2到上一层 即 第二层Move
回到第二次Move
Move(4) = 5
Move(3) :n = 3 进入if 判断 满足if条件,所以 cnt = n 返回 3
再次回到第一层Move:
cnt = Move(4)+Move(3) = 5+ 3 = 8 即返回8到主函数
cnt = 5+3 = 8
*/