汉诺塔(Hanoi)问题之走进递归全解

不知道学习编程的小伙伴们是否有过和我一样的经历,当我们初学编程时,汉诺塔问题是很难跨越一道坎,不仅因为它使用到了递归,并且和我们初识的递归题(比如说求阶乘,斐波拉契数列项等等)不太一样,在该问题的函数实现中包含了多重递归,中间的逻辑性也不太容易理解。也正因如此,当时因为老师没有要求一定将它研究透而有点小确幸,但其实这样做是不对的,正如一句话所说“当你觉得一条路很艰难的时候,一定是上坡路!”。所以今天就让小风来带着大家一起迎难而上,提升自己的实力吧!


前言

首先很高兴能和各位热爱编程的小伙伴一起解决问题,汉诺塔问题可以说是递归中非常经典的一道问题,我们不管初学哪一门语言时,当学到递归章节或多或少都可能会听说甚至是接触到它,从这我们大概也能猜出它是非常重要的一个问题,虽然我们现在可能初学递归觉得它很难,但我们并不能因此而选择放弃,因为它象征着我们是否真正能否走进递归世界的一道重要标准之一。

OK,咱们进入主题!像很多类似讲解汉诺塔问题的文章直接就将所有的汉诺塔问题都直接一步带过说它一定经过三个过程,当然事实虽然如此,但他们都没有将其中的原理讲的清晰明了,很多时候可能会直接带过。这样通常就会使得我们理解起来感到非常的突兀,那么今天小风就带着大家如何将其中的结论给归纳出来,希望能对大家有所帮助

一、汉诺塔问题

 问题描述

在汉诺塔问题当中,设有3根标号为A、B、C的三根柱子,在A柱上放着n个盘子,每一盘子逗比下面的盘子要小一点,要求把A柱上的盘子全部转移到C柱上。并遵循如下移动规则:

  1. 一次只能移动一个盘子
  2. 移动过程中大盘子不能放在小盘子上面
  3. 在移动过程中盘子可以放在A、B、C的任意一个柱子上

输入格式
输入一个整数n,代表盘子的数目

输出格式
输出移动盘子的具体步骤。例如:B->C,即表示把盘子从B柱移到C柱

二、实现代码

#include<stdio.h>

//交换函数
void Swap(char x, char z)
{
	printf("%c->%c\n", x, z);
}

//定义递归函数,三步走
void Hanoi(int n, 
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

whelloworldw

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

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

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

打赏作者

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

抵扣说明:

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

余额充值