青蛙跳台阶
这个篇幅不多比较简单汉诺塔问题比较简单
- 青蛙跳台阶思想
- 青蛙跳台阶和斐波那契数列基本一样
- 区别多了几个判断
看这个图就可以推导出来公式Fib(n-1)+Fib(n-2)
想法实现
int jump_step(int n)
{
if (n == 0)//这个其实可以不用写,我单纯没事干,我测试跑了一下输入0,然后程序崩了,就加了一句
{
return 0;
}
if (n == 1)//1的时候只有1种
{
return 1;
}
else if (n == 2)//2种只有俩种
{
return 2;
}
else//其余进入递归
{
return jump_step(n - 1) + jump_step(n - 2);
}
}
int main()
{
int n = 0;
scanf("%d", &n);//青蛙需要跳多少台阶
int ret= jump_step(n);
printf("%d", ret);
return 0;
}
篇幅不多说,重点是汉诺塔
汉诺塔
汉诺塔
- 这个是本文章的重点,我研究了些时间,才搞懂
数学中
汉诺塔问题假设有n片,移动次数是f(n).显然f(1)=1,f(2)=3,f(3)=7,且f(k+1)=2*f(k)+1。此后不难证明f(n)=2^n-1
大致看一下他是怎么个玩法的
这里的流程大致是
- A1->C
- A2->B
- C(A1)->B
- A3->C
- B(A1)->A
- B(A2)->C
- A->C
这里你发现了啥,如果要把3号圆盘移到C柱子上,那么一定要吧他上面的圆盘移到B上,那么就可以把它看成一个整体
图解:
在来举个例子,例子是通过看李永乐老师的视频知道的
塞大象
- 就是说你把大象塞进冰箱需要几步?
- 答案是3步
- 1:开冰箱门
- 2:塞大象
- 3:关冰箱门
emmm,这个🌰和汉诺塔有啥关系,把n-1看成塞大象,就是繁琐就是塞大象,你不用管我怎么塞进去的,你只需要知道我把大象塞进去了,还关在冰箱里,如果觉得这个太抽象了,在举一个例子
例子2:
假设我是个老板,我叫张三过来,说你去给我造一个宇宙飞船,我要当太空人,如果你不把造出来就扣你工资,张三一听不行不行,扣工资怎么行,然后他说保证完成任务,然后我就出去了,回来我就发现宇宙飞船造好了,然后我就去当太空人了
- 这里张三造飞船就是塞大象,就是汉诺塔n-1,我不需要管他怎么做到的,我只需要知道他造出来了,我可以当太空人了就可以了。
那么就看下代码
void Hanoi(int n,char a,char b,char c)
{
if (n == 1)//圆盘只有一个的时候只有一种方法,就是A->C
{
printf("%c柱->%c柱\n", a, c);//a柱子移到c柱子
}
else
{
Hanoi(n - 1, a, c, b);//把a上n-1个圆盘通过c-->b上
printf("%c柱->%c柱\n", a, c);//a-->c
Hanoi(n - 1, b, a, c);//把b上n-1个圆盘从通过a移到c上
}
}
int main()
{
int n = 0;
scanf("%d", &n);
char a = 'A';
char b = 'B';
char c = 'C';
Hanoi(n,a,b,c);//这里圆盘个个数,和A,B,C柱
return 0;
}
看到这里一定很懵逼,对吧,我刚刚开始也很懵逼,那么继续往下看,详细的流程图
具体流程图
- 拓展一下,栈:
- 每次递归都会在栈上开辟一块空间
- 栈是先进后出,就是例子(图解释吧)
- 栈上放着都是临时变量,函数的行和每次递归所创建的变量
- 下面我就放流程图和我觉得有必要的解析,大家下去可以自己调试画图
递归流程
栈的情况
条件不满足,开始回调,函数从那里回到那里去
出栈,就是释放:
打印现在的圆盘步骤
A->C
A->B
进入下面的递归
此时栈的情况
打印步骤
A->C
A->B
C->B
出递归
栈的情况
打印步骤
A->C
A->B
C->B
A->C
此时栈的情况:因为全部反递归回去了
(14步进入下面递归)
栈的情况:
打印步骤
A->C
A->B
C->B
A->C
B->A
开始回递
栈区情况
到这里也基本就结束了
打印步骤
A->C
A->B
C->B
A->C
B->A
B->C
A->C
上编译器结果
提示
- 如果青蛙跳台阶看的吃力请看博主之前写的递归篇,看斐波那契有详细讲解青蛙跳台阶思想
- 汉诺塔自己多调试画图,上面,那个其实就是柱子换来换去比较麻烦,有时候会混
- 汉诺塔需要多花点心思,加油!!!
总结
- 虽然,就几行代码,我研究的挺久(博主有点笨,有时候脑子转不过弯来),理论理解就花了好久,代码理解又花了好多时间,然后总结出来又花了好些时间
- 坚持,哈哈哈慢慢理解总会明白就是快慢问题罢了
- 把它搞懂的感觉真的非常棒,我喜欢这种感觉哈哈,就挺激动的,虽然中间挺让人奔溃和烦恼哈哈
本篇文要是那里有错,请大胆指出(评论区或加我QQ(1696912943,给我留面哈哈哈)),博主,钱包不厚,不过脸皮厚,所以不会伤到博主自尊心,
持续更新中………………