用汉诺塔问题理解函数的递归

首先我们先了解一下什么是汉诺塔问题

 让我们把这道题目的大概要求翻译成人话:

有下面这两个问题等待我们去解决-

1.有三个柱子,A,B,C我们要把A柱子上的所有圆盘都转移到C柱子上,且要将圆盘以从大到小的方式从下往上放。

2.要搞明白为什么会出现三根可以选择的柱子,尤其是这三个这个数字,让我联想到了中间变量中间存储变量值。

首先让我们来解决问题1,最大的圆盘要放在C杆最底部,我们就需要将最大盘以上的所有盘子取出去,方便我们将最大的盘拿出来,而且每次只能移动一个盘子。

递归的概念

递归分为两个过程,递推和回归

递推就是我们不断将问题进行和简化的过程,而回归就是我们在该次递推下达到的效果

简化就可以理解为不断自己调用自己的过程,而函数就是完成一个固定的动作做,我们就需要找出这个问题下不断重复的动作就可以。

让我们回到汉诺塔问题本身,要找出这个问题中不断重复的动作,我们先将这个问题抽象出来:

其实这三个柱子可以按功能分为,传接柱、起始柱,目标柱,想要实现将圆盘以从下到上排列就必须将每一个盘子的上面的其余盘子拿开,我们就可以移动这个盘子了。

ok,我们就拿移动最后一个圆盘举例,我们就得将最后一个圆盘上的盘子都存放到B盘上,而下一个圆盘就得将该圆盘上的盘子放在A盘上

我们就得到了一个动作;将起始柱上的其余圆盘拿到转接柱上,将最后一个圆盘放到目标柱上,而且我们发现,起始柱和转接柱是可以互相转化的。

递推的过程我们就明白了,下一个回归就是将这一次最后的圆盘移动到C柱上。思路搞定我们就可以开始敲代码了。

#define line 5//有line个圆盘
#include<stdio.h>
void Hanoi(char start, char exchange, char target,int n)
{
	if(n==1)
	{
		printf("%c->%c", &start, &target);
	}
	else
	{
		Hanoi(n - 1, 'a', 'b', 'c');//此时a为目标柱
		printf("%c->%c", start, exchange);
		Hanoi(n - 1, 'b','a', 'c');//此时b为目标柱
	}
}

int main()
{
	int t = line;
	Hanoi('a', 'b', 'c',t);
	return 0;
}

汉诺塔问题解决,小萌新的一点点感想,希望能得到大佬们的指点。

  • 4
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Caking—coding

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值