这个篇幅不多比较简单汉诺塔问题比较简单
看这个图就可以推导出来公式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
这里你发现了啥,如果要把3号圆盘移到C柱子上,那么一定要吧他上面的圆盘移到B上,那么就可以把它看成一个整体
图解:
在来举个例子,例子是通过看李永乐老师的视频知道的
塞大象
emmm,这个和汉诺塔有啥关系,把n-1看成塞大象,就是繁琐就是塞大象,你不用管我怎么塞进去的,你只需要知道我把大象塞进去了,还关在冰箱里,如果觉得这个太抽象了,在举一个例子
例子2:
假设我是个老板,我叫张三过来,说你去给我造一个宇宙飞船,我要当太空人,如果你不把造出来就扣你工资,张三一听不行不行,扣工资怎么行,然后他说保证完成任务,然后我就出去了,回来我就发现宇宙飞船造好了,然后我就去当太空人了
那么就看下代码
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,给我留面哈哈哈)),博主,钱包不厚,不过脸皮厚,所以不会伤到博主自尊心,
持续更新中………………