汉诺塔问题其实很简单 Python 递归经典面试题
话不多说,上代码
1 def hanoi_move(n, source, dest, intermediate):
2 if n >= 1: # 递归出口,只剩一个盘子
3 hanoi_move(n-1, source, intermediate, dest)
4 print("Move %s -> %s" % (source, dest))
5 hanoi_move(n-1, intermediate, dest, source)
首先我们这里有三根杆子依次排放,分别是 源杆、媒介杆、目标杆 对应 代码的 source、dest、intermediate,源杆上有n块大饼
我们定义一个函数 def hanoi(n,源杆,目标杆,媒介杆):# 意思是源杆 借助 媒介杆 到 目标杆
我们假设除了底下最后一层上面的n-1层都已经摆放好了,即源杆上目前只有两块大饼,我们要执行的操作是:
源杆上的n-1层 借助 目标杆 到 媒介杆 等同于 hanoi(n-1,源杆,媒介杆,目标杆)相当于n-1层在媒介杆上了
打印 源杆 到 目标杆 显示路径
再把媒介杆的n-1层 借助 源杆 到 目标杆 等同于 hanoi(n-1,媒介杆,目标杆,源杆)
再来说说为什么假设n-1层的,因为我们在假设n-1层的时候使用了递归,在hanoi(n-1…)的时候我们就是假设n-2层已经摆放好了,然后就是在hanoi(n-2…)的时候我们假设n-3层已经摆放好了,不断回溯,就到了最上面一层已经摆放好了,这个假设是合理的,既可以使用该方法。使用了递归的回溯思想,如果使用递归思想不断地推出他的步骤那基本是不可能的,然而通过前提不断地假设反而更容易拿到结果。
汉诺塔问题其实很简单 Python 递归经典面试题的更多相关文章
- 汉诺塔问题深度剖析(python实现)
当我们学习一门编程语言的时候,都会遇到递归函数这个问题.而学习递归的一个经典案例就是汉诺塔问题.通过这篇文章,观察移动三个盘子和四个盘子的详细过程,您不仅可以深刻的了解递归,也更加熟悉了汉诺塔的游戏的 ...
- T2485 汉诺塔升级版(普及)(递归)
https://www.luogu.org/problem/show?pid=T2485 题目背景 汉诺塔升级了 题目描述 现在我们有N个圆盘和N个柱子,每个圆盘大小都不一样,大的圆盘不能放在小的圆盘 ...
- 四柱加强版汉诺塔HanoiTower----是甜蜜还是烦恼
我想很多人第一次学习递归的时候,老师或者书本上可能会举汉诺塔的例子. 但是今天,我们讨论的重点不是简单的汉诺塔算法,而是三柱汉诺塔的延伸.先来看看经典的三柱汉诺塔. 一.三柱汉诺塔(Hanoi_Thr ...
- 递归--练习2--noi6261汉诺塔
递归--练习2--noi6261汉诺塔 一.心得 先把递推公式写出来,会很简单的 二.题目 6261:汉诺塔问题 总时间限制: 1000ms 内存限制: 65536kB 描述 约19世纪末,在欧州 ...
- 【ACwing 96】奇怪的汉诺塔——区间dp
(题面来自ACwing) 汉诺塔问题,条件如下: 1.这里有A.B.C和D四座塔. 2.这里有n个圆盘,n的数量是恒定的. 3.每个圆盘的尺寸都不相同. 4.所有的圆盘在开始时都堆叠在塔A上,且圆盘尺 ...
- 【C语言】汉诺塔问题
之前遇见这个问题,非常费劲地理解了,并写出代码,然后过段时间,再遇见这个问题,又卡住了,如此反反复复两三次,才发现自己对递归的理解依然很肤浅.今天无聊,重温<算法:c语言实现>一书,又遇见 ...
- 汉诺塔算法的递归与非递归的C以及C++源代码
汉诺塔(又称河内塔)问题其实是印度的一个古老的传说. 开天辟地的神勃拉玛(和中国的盘古差不多的神吧)在一个庙里留下了三根金刚石的棒,第一根上面套着64个圆的金片,最大的一个在底下,其余一个比一 个小, ...
- 汉诺塔III 汉诺塔IV 汉诺塔V (规律)
汉诺塔III Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Subm ...
- 汉诺塔问题(C++版)
题目描述 Description 约19世纪末,在欧州的商店中出售一种智力玩具,在一块铜板上有三根杆,最左边的杆上自上而下.由小到大顺序串着由64个圆盘构成的塔.目的是将最左边杆上的盘全部移到中间的杆 ...
随机推荐
- Anconda 3.7安装以及使用详细教程
Anconda 3.7安装以及使用详细教程 2019-04-17 22:42:03 一.下载anconda 3.7 链接地址:官方地址 二.安装 双击下载好的Anaconda3-2019.03- ...
- RSP小组——团队冲刺博客四
RSP小组--团队冲刺博客四 冲刺日期:2018年12月13日 前言 问题已经明确,经过今天的努力,部分已近得到解决,所以,今天是一个值得庆祝的日子. 各成员今日(12.13)完成的任务 李闻洲对音乐 ...
- css3_transition: 体验好的过渡效果。附 好看的按钮
利用css的transition属性详解,上图就是利用transition效果做的一个按钮. transition属性://举例子:transition:all 1s ease;transition: ...
- Android SQLite数据库升级,怎么做(事物更改)
SQLiteOpenHelper // 如果数据库文件不存在,只有onCreate()被调用(该方法在创建数据库时被调用一次) public abstract void onCreate(SQLite ...
- python学习笔记(6)
第6章 组合数据类型 组合类型的三种表达形式:集合.序列.字典 集合类型及操作 定义:集合是多个元素的无序组合 集合类型与数学中的集合概念一致 集合元素之间无序,每个元素唯一,不存在相同元素 集合元素 ...
- vue百度地图插件
安装 npm i --save vue-baidu-map 代码 <template> <div> <baidu-map v-bind:style="mapSt ...
- 微信小程序开发---各代码文件简介
根据上一文,已建立QuickStart 项目,该项目系本人毕设部分内容,所以记录以便以后查阅 开发小程序就必须了解小程序项目目录结构和文件作用,接下来就根据我现在自学得到的知识把这些记录下来. 一.目 ...
- JavaScript经典作用域问题(转载)
题目 var a = 10; function test(){ a = 100; console.log(a); console.log(this.a); var a; console.log(a); ...
- Ubuntu16.04安装之后连不上无线网?有可能是Realtek rtl8822be的原因
原以为昨天已基本写完在接触到Ubuntu以来遇到的所有问题了... 没想到今天去看有关ROS的资料时,居然无意间又看到了之前遇到的一个巨坑:安装完Ubuntu16.04之后,无线网用不了,根本无法连接 ...
- 用递归方法求n的阶乘
代码: #include<iostream> using namespace std; int fact(int n); int main() { int n; loop: cin > ...