经典算法:汉诺塔

学编程,学IT,算法也是必不可缺的,这一次给你们带来一个经典的递归算法题,汉诺塔。算是算法的入门小题目之一吧~前端

视频教程

什么是汉诺塔?

我这里直接拉来一个图解释一下(挂了请联系我)
Image text
就是这么一个东西了,把全部的圆盘从左边移动到右边,而且大的圆盘不可以压住小的。怎么才能完成呢?java

规则理解了,开始钻牛角尖

先来看看只有一个圆盘的状况,python

嗯 至关的简单 A--->C 就能够了golang

两个的状况呢? 也不难 A--->B A--->C B--->C算法

三个的话有点挑战了 你们本身推一推编程

好的 十个呢?就算想了半天弄好了,怎么让程序帮咱们作呢?头大!微信

牛角尖钻完了,冷静分析

在咱们每次距离对称最近的状态,都是把最大的圆盘放到了最右边,剩下的圆盘放到了中间。
Image text
而后把中间的再都放到右边就行了测试

这道理就跟把大象装冰箱同样啊 都是三步呢!spa

这时候千万不要去想怎么把n-1层都搬到B柱 也不要想怎么把N-1层都搬到C柱,若是继续想下去你就会进入死循环,这时候你只须要作一个思惟转换。3d

Image text

当咱们把n-1层都搬到了中间柱的时候,只须要把最大的那个盘,从A搬到C柱就行了,剩下的怎么办呢?C柱永远是目标柱,咱们不须要去移动它。这时候咱们大点力!把B柱子掰下来!扔到A前面!无视掉C柱上面的大圆盘,由于咱们不会再去动它了!是否是画面似曾相识?对啊!递归啊!继续把最左边的n-1层都弄到中间,最大的扔到C就行了啊!

看到这里若是你还在钻牛角尖的话,能够暂时休息一下了。

思惟转换完成的过来写代码!

// JS写一下
function move(num,from,button,to){
    // 若是只有一个圆盘
    if(num==1){
        console.log(from,"---->",to)
        // 最左边的放到最后边完了个事!
        return
    }
    // 若是柱子有点多咋办呢?
    // 先把n-1个左边的放到中间呗
    move(num-1,from,to,button) //放过去了,具体过程是啥?我特么哪里知道 它里面怎么操做?管他呢,反正他本身知道本身干了啥
    console.log(from,"---->",to) // 我就干一件事,我就把左边最大的放到右边,虽然我不知道如今我是否是真正的左边,我多是被你大力从中间拽过来的左边。
    // 放完了而后呢?
    // 把全部中间的柱子扔到最右边去
    move(num-1,button,from,to)
}

move(3,"A","B","C") //测试一下
//golang
package main

import (
    "fmt"
)

func main() {
    move(3,"A","B","C")
}

func move(num int,from string,button string,to string){
    if num==1 {
        fmt.Printf("%s--->%s\n",from,to)
        return
    }
    move(num-1,from,to,button)
    fmt.Printf("%s--->%s\n",from,to)
    move(num-1,button,from,to)
}
# python

def move(num ,fro,button,to)
    if (num==1)
        print(fro,'--->',to)
        return
    move(num-1,fro,to,button)
    print(fro,'--->',to)
    move(num-1,button,fro,to)
move(3,'A','B','C')

总结

递归这个东西,千万不可钻牛角尖,把大问题分红小问题,复杂问题简单化,若是非要把递归过程推出来的话,那谁都救不了你

欢迎你们关注个人博客,里面会有我所写博客的视频版本,若是你有更多疑问或者想学前端的话,能够加我微信shouzi_1994或者在博客下方品论留言,三大Q.

相关文章
相关标签/搜索