C语言进阶之旅 番外篇递归(青蛙跳台阶和汉诺塔)

文章目录

  • 青蛙跳台阶
  • 汉诺塔
    • 具体流程图
  • 提示
  • 总结

青蛙跳台阶

这个篇幅不多比较简单汉诺塔问题比较简单

  • 青蛙跳台阶思想
  • 青蛙跳台阶和斐波那契数列基本一样
  • 区别多了几个判断

看这个图就可以推导出来公式Fib(n-1)+Fib(n-2)
C语言进阶之旅 番外篇递归(青蛙跳台阶和汉诺塔)_第1张图片

想法实现

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;
}

篇幅不多说,重点是汉诺塔

汉诺塔

汉诺塔

  1. 这个是本文章的重点,我研究了些时间,才搞懂

汉诺塔幕后故事

   数学中
   汉诺塔问题假设有n片,移动次数是f(n).显然f(1)=1,f(2)=3,f(3)=7,且f(k+1)=2*f(k)+1。此后不难证明f(n)=2^n-1

大致看一下他是怎么个玩法的

C语言进阶之旅 番外篇递归(青蛙跳台阶和汉诺塔)_第2张图片
这里的流程大致是

  1. A1->C
  2. A2->B
  3. C(A1)->B
  4. A3->C
  5. B(A1)->A
  6. B(A2)->C
  7. A->C

这里你发现了啥,如果要把3号圆盘移到C柱子上,那么一定要吧他上面的圆盘移到B上,那么就可以把它看成一个整体
图解:
C语言进阶之旅 番外篇递归(青蛙跳台阶和汉诺塔)_第3张图片



在来举个例子,例子是通过看李永乐老师的视频知道的
塞大象

  • 就是说你把大象塞进冰箱需要几步?
  • 答案是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;
}

看到这里一定很懵逼,对吧,我刚刚开始也很懵逼,那么继续往下看,详细的流程图



具体流程图

  1. 拓展一下,栈:
  2. 每次递归都会在栈上开辟一块空间
  3. 栈是先进后出,就是例子(图解释吧)
  4. 栈上放着都是临时变量,函数的行和每次递归所创建的变量
  5. 下面我就放流程图和我觉得有必要的解析,大家下去可以自己调试画图

递归流程C语言进阶之旅 番外篇递归(青蛙跳台阶和汉诺塔)_第4张图片
栈的情况
C语言进阶之旅 番外篇递归(青蛙跳台阶和汉诺塔)_第5张图片
条件不满足,开始回调,函数从那里回到那里去




C语言进阶之旅 番外篇递归(青蛙跳台阶和汉诺塔)_第6张图片
出栈,就是释放:

C语言进阶之旅 番外篇递归(青蛙跳台阶和汉诺塔)_第7张图片


打印现在的圆盘步骤
A->C
A->B
进入下面的递归
C语言进阶之旅 番外篇递归(青蛙跳台阶和汉诺塔)_第8张图片
此时栈的情况
C语言进阶之旅 番外篇递归(青蛙跳台阶和汉诺塔)_第9张图片
打印步骤
A->C
A->B
C->B
出递归
C语言进阶之旅 番外篇递归(青蛙跳台阶和汉诺塔)_第10张图片
栈的情况
C语言进阶之旅 番外篇递归(青蛙跳台阶和汉诺塔)_第11张图片
C语言进阶之旅 番外篇递归(青蛙跳台阶和汉诺塔)_第12张图片
打印步骤
A->C
A->B
C->B
A->C
此时栈的情况:因为全部反递归回去了
C语言进阶之旅 番外篇递归(青蛙跳台阶和汉诺塔)_第13张图片
(14步进入下面递归)
C语言进阶之旅 番外篇递归(青蛙跳台阶和汉诺塔)_第14张图片
栈的情况:
C语言进阶之旅 番外篇递归(青蛙跳台阶和汉诺塔)_第15张图片
打印步骤
A->C
A->B
C->B
A->C
B->A

开始回递
C语言进阶之旅 番外篇递归(青蛙跳台阶和汉诺塔)_第16张图片
栈区情况
C语言进阶之旅 番外篇递归(青蛙跳台阶和汉诺塔)_第17张图片
到这里也基本就结束了
打印步骤
A->C
A->B
C->B
A->C
B->A
B->C
A->C
上编译器结果
C语言进阶之旅 番外篇递归(青蛙跳台阶和汉诺塔)_第18张图片

提示

  • 如果青蛙跳台阶看的吃力请看博主之前写的递归篇,看斐波那契有详细讲解青蛙跳台阶思想
  • 汉诺塔自己多调试画图,上面,那个其实就是柱子换来换去比较麻烦,有时候会混
  • 汉诺塔需要多花点心思,加油!!!

总结

  • 虽然,就几行代码,我研究的挺久(博主有点笨,有时候脑子转不过弯来),理论理解就花了好久,代码理解又花了好多时间,然后总结出来又花了好些时间
  • 坚持,哈哈哈慢慢理解总会明白就是快慢问题罢了
  • 把它搞懂的感觉真的非常棒,我喜欢这种感觉哈哈,就挺激动的,虽然中间挺让人奔溃和烦恼哈哈

本篇文要是那里有错,请大胆指出(评论区或加我QQ(1696912943,给我留面哈哈哈)),博主,钱包不厚,不过脸皮厚,所以不会伤到博主自尊心,

持续更新中………………

你可能感兴趣的:(c语言,汉诺塔,c语言)