Hanoi

Hanoi。。。。一个神奇的东西,总而言之,这就是个最基本的递归运用啦。。。不过呢,现在有很多同学还是不太明白啥是递归。
总而言之呢。。。。就像俄罗斯套娃。一层套一层。。。不断去挖掘,而且这个东西每调用一次就会和前面重复一次,所以,我们可以总结出这个规律,把这个规律称为递归公式,很多同学会觉得这个就像一个黑洞,没错,一层层陷进去,然而,当我们题目的某些要求达到了,或者到达某种极限,我们就可以返回上一层了。。。把这个达到的某种条件称为递归出口。。。
所以呢,一定要把这个递归学好,因为。。。。。。后面的的动态规划要用很多很多。。。那里递归的不是公式而是状态,递归公式变为动态转移方程。。。所以。。。递归和前面链表一样很重要!!!
来讲讲HANOI的问题吧。。
习惯先上代码:。。。。

#include <stdio.h>
#include <string.h>
void Hanoi(int n,char a,char b,char c){///a为起始塔,b为借助塔,c为目标塔
    if(n==1){
        printf("%c -> %c\n",a,c);///只有一个移动物的话,直接将其从所在塔移到目标塔
        return ;
    }
    Hanoi(n-1,a,c,b);/// No.1
    printf("%c -> %c\n",a,c);
    Hanoi(n-1,b,a,c);///NO.2;
}
int main(){
    int n;
    scanf("%d",&n);
    Hanoi(n,'A','B','C');
}

这里写图片描述(本图片来自网络。若有侵犯….私聊私聊)
我们可以把问题简化为:Hanoi塔由两部份组成,一部分是最底下的第n片,和它上面的n-1部分构成。。两片的话,你们都知道怎么动吧,就像图里的一样。。
代码中的No.1就是实现把n-1(在所在柱a,通过借助柱c,转移到目标柱b)转移到b,这里需要递归实现。
看第三张图。。n-1个在b柱,n在C柱,也就是说,最下面的已经在最终的目标柱了,而且它肯定在最下面,就不需要动了(也就是说在后面的移动过程中,没有它 的事情了),这时候,我们把a柱和b柱换一下位置,是不是又回到了图一,想一下。。。这里的状态转移。。
这时候b变为所在柱,a变为借助柱,c变为目标柱了,此时我们代码中的No.2就是这个递归。。。
Hano就是这个意思。。。其实就是基础的递归,想明白了就好啦。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值