欢迎光临散文网 会员登陆 & 注册

C语言自学---函数递归

2023-06-28 17:57 作者:Klein要飞天  | 我要投稿

递归的通俗解释:

将一个复杂的大问题变成多个类似的小问题,通过解决小问题层层递进从而将大问题解决,可以和循环放在一起进行比较,两者有一定的相似之处。

汉诺塔问题:

作为经典的递归问题的代表,up主一开始也以为递归就是上面的通俗解释就没啥了,还以为挺简单的,跟着网上的视频教学学习以后解决了一些比较简单的问题以后发现好像也不难,但是遇到汉诺塔问题以后就直接懵了,这玩意怎么用递归啊,于是我就在网上看人家的教学,csdn上面呢写的都挺好的,但是关键的明白是这个道理但是为什么这样做呢,于是就看视频,接下来说说我自己的见解。

汉诺塔问题:

汉诺塔(Hanoi Tower)问题来源于印度一个古老传说。大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘。大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。并且规定,任何时候,在小圆盘上都不能放大圆盘,且在三根柱子之间一次只能移动一个圆盘。也就是如下:

汉诺塔问题

实际问题转换过来就是将最左边的64个圆盘位置变成最右边的圆盘位置。

递归小问题转化:

当盘子只有一个的时候

一个盘子时

只需要将A上的一个盘子直接移向C上即可。

当盘子有两个的时候


两个圆盘时

当盘子增加到两个时,首先做的就是将最上面一个圆盘放在辅助的柱子上,然后将下面的圆盘放在C柱上,再将辅助列的小圆盘放在C柱上,这样就完成了。

如果当盘子增加到三个时

三个圆盘时

具体的步骤移动步骤如上图,移动两个圆盘和三个圆盘时,可以类比成一样的情况,当圆盘从两个变成三个时,把最下面的大圆盘变成一个整体(整体B),将大圆盘上面的其他圆盘变成一个整体(整体A),从而就将三个圆盘的问题变成了两个整体(整体A和整体B)的问题可以近似堪称两个圆盘,也就是将三个圆盘从A柱移到C柱的问题变成了将整体A和B从A柱移到C柱的问题。

往后延伸的话,假设是有n个圆盘,那么整个大问题无非就是拆分成三步,第一步,将A柱的n-1个圆盘借助C柱移动B柱,第二步,将A柱的大圆盘移动到C柱,第三步,将B柱上的n-1个圆盘借助A柱移到C柱。以上也就是体现出递归思想的逻辑。


具体代码如下:

P1
P2

在P2中可以看到输出的结果是正确的,就以上的3个圆盘的例子,我们可以发现在hanoi函数中其实也就是主要三个步骤,对应的就是上面提到的三个步骤。

使用平台:Visual Studio 2022

使用语言:C语言

以上内容均属个人思维逻辑,如有错误,大家可以提出疑问和质疑。

C语言自学---函数递归的评论 (共 条)

分享到微博请遵守国家法律