零基础入门学习Python(24)--递归:汉诺塔
知识点
这节课主要讲解用递归的方法,实现汉诺塔的解答
对于游戏的玩法,我们可以简单分解为三个步骤:
1) 将前63个盘子从X移动到Y上。
2) 将最底下的第64个盘子从X移动到Z上。
3) 将Y上的63个盘子移动到Z上。
问题一:将X上的63个盘子借助Z移到Y上;
1) 将前62个盘子从X移动到Z上。
2) 将最底下的第63个盘子移动到Y上。
3) 将Z上的62个盘子移动到Y上。问题二:将Y上的63个盘子借助X移到Z上。
1) 将前62个盘子从Y移动到X上。
2) 将最底下的第63个盘子移动到Z上。
3) 将X上的62个盘子移动到Y上。
用递归方法实现
#汉诺塔
def hanoi(n,x,y,z):
if n == 1:
print(x,'-->移动至',z)
else:
hanoi(n-1,x,z,y)#将前n-1个盘从x移动至y上
print(x,'-->移动至',z)#将最底下一个盘从x移动至z上
hanoi(n-1,y,x,z)#将y上的n-1个盘从y移动至z上
n = int(input('请输入汉诺塔的层数:'))
hanoi(n,'A','B','C')
================= RESTART: C:\Users\ThinkPad\Desktop\test.py =================
请输入汉诺塔的层数:5
A -->移动至 C
A -->移动至 B
C -->移动至 B
A -->移动至 C
B -->移动至 A
B -->移动至 C
A -->移动至 C
A -->移动至 B
C -->移动至 B
C -->移动至 A
B -->移动至 A
C -->移动至 B
A -->移动至 C
A -->移动至 B
C -->移动至 B
A -->移动至 C
B -->移动至 A
B -->移动至 C
A -->移动至 C
B -->移动至 A
C -->移动至 B
C -->移动至 A
B -->移动至 A
B -->移动至 C
A -->移动至 C
A -->移动至 B
C -->移动至 B
A -->移动至 C
B -->移动至 A
B -->移动至 C
A -->移动至 C
课后习题
动动手
- 使用递归编写一个十进制转换二进制的函数(要求采用“除2取余”的方式,结果与调用bin()一样返回字符串形式)
#迭代形式
def Dec2Bin(dec):
temp = []
result =''
while dec:
x = dec % 2
dec //= 2
temp.append(x)
while temp:
result += str(temp.pop())
return result
print(Dec2Bin(10))
================= RESTART: C:\Users\ThinkPad\Desktop\test.py =================
1010
#递归形式
def Dec2Bin(dec):
result = ''
if dec:
result = Dec2Bin(dec//2)
return result + str(dec%2)
else:
return result
print(Dec2Bin(10))
================= RESTART: C:\Users\ThinkPad\Desktop\test.py =================
1010
>>>
- 写一个函数get_digits(n),将参数n分解出每个位的数字并按顺序存放到列表中。举例:
get_digits(12345) ==> [1,2,3,4,5]
result = []
def get_digits(n):
if n > 0:
result.insert(0,n%10)
get_digits(n//10)
#result.sort()
get_digits(512364)
print(result)
================= RESTART: C:\Users\ThinkPad\Desktop\test.py =================
[5, 1, 2, 3, 6, 4]
- 还记得求回文联字符串那道题吗?现在让你使用递归的方式求解?
def is_palindrome(n, start, end):
if start > end:
return 1
else:
return is_palindrome(n, start+1, end-1) if n[start] == n[end] else 0
string = input('请输入一串字符串:')
length = len(string)-1
if is_palindrome(string, 0, length):
print('\"%s\"是回文字符串!' % string)
else:
print('\"%s\"不是回文字符串!' % string)
使用递归编程求解以下问题:
有5个人坐在一起,问第五个人多少岁?他说比第4个人大2岁。问第4个人岁数,他说比第三个人大2岁。问第三个人,又说比第二个人大2岁。问第2个人,说比第一个人大2岁。最后问第一个人,他说是10岁。请问第五个人多大?
def age(n):
if n == 1:
return 10
else:
return age(n-1) + 2
print('哈哈,我知道了,第五个人的年龄是 %d 岁,啵啵脆!' % age(5))
零基础入门学习Python(24)--递归:汉诺塔的更多相关文章
- 《零基础入门学习Python》【第一版】视频课后答案第001讲
测试题答案: 0. Python 是什么类型的语言? Python是脚本语言 脚本语言(Scripting language)是电脑编程语言,因此也能让开发者藉以编写出让电脑听命行事的程序.以简单的方 ...
- 【Python教程】《零基础入门学习Python》(小甲鱼)
[Python教程]<零基础入门学习Python>(小甲鱼) 讲解通俗易懂,诙谐. 哈哈哈. https://www.bilibili.com/video/av27789609
- 零基础入门学习Python(1)--我和Python的第一次亲密接触
前言 最近在学习Python编程语言,于是乎就在网上找资源.其中小甲鱼<零基础入门学习Python>试听了几节课,感觉还挺不错,里面的视频都是免费下载,小甲鱼讲话也挺幽默风趣的,所以呢,就 ...
- 学习参考《零基础入门学习Python》电子书PDF+笔记+课后题及答案
国内编写的关于python入门的书,初学者可以看看. 参考: <零基础入门学习Python>电子书PDF+笔记+课后题及答案 Python3入门必备; 小甲鱼手把手教授Python; 包含 ...
- 学习《零基础入门学习Python》电子书PDF+笔记+课后题及答案
初学python入门建议学习<零基础入门学习Python>.适合新手入门,很简单很易懂.前一半将语法,后一半讲了实际的应用. Python3入门必备,小甲鱼手把手教授Python,包含电子 ...
- 零基础入门学习Python(22)--函数:递归是神马
知识点 递归是神马? 递归是属于算法的范畴. 递归就是函数调用自身的一种行为. >>> def g(): return g() >>> g() Traceback ...
- 【Python学习之七】递归——汉诺塔问题的算法理解
汉诺塔问题 汉诺塔的移动可以用递归函数非常简单地实现.请编写move(n, a, b, c)函数,它接收参数n,表示3个柱子A.B.C中第1个柱子A的盘子数量,然后打印出把所有盘子从A借助B移动到C的 ...
- 零基础入门学习Python(36)--类和对象:给大家介绍对象
知识点 Python3 面向对象 Python从设计之初就已经是一门面向对象的语言,正因为如此,在Python中创建一个类和对象是很容易的.本章节我们将详细介绍Python的面向对象编程. 如果你以前 ...
- 零基础入门学习Python(17)--函数:Python的乐高积木
前言 相信大家小时候都玩过神奇的乐高积木, 只要通过想象力和创造力我们可以拼凑很多神奇的东西,那么随着我们学习的深入,我们编写的Python代码也将日益增加,并且也越来越复杂, 所以呢,我们需要找寻一 ...
随机推荐
- bzoj 2127 happiness【最小割+dinic】
参考:https://www.cnblogs.com/chenyushuo/p/5144957.html 不得不说这个建图方法真是非常妙啊 假设S点选理,T点选文,a[i][j]为(i,j)选文收益, ...
- python中threading模块中的Join类
join类是threading中用于堵塞当前主线程的类,其作用是阻止全部的线程继续运行,直到被调用的线程执行完毕或者超时.具体代码如下: import threading,time def doWai ...
- 对比度受限的自适应直方图均衡化(CLAHE)
直方图均衡化(HE)是一种很常用的直方图类方法,基本思想是通过图像的灰度分布直方图确定一条映射曲线,用来对图像进行灰度变换,以达到提高图像 对比度的目的.该映射曲线其实就是图像的累计分布直方图(CDF ...
- synchronized(4)修饰语句块之:synchronized(this)
synchronized(this) 此时,线程获得的是对象锁.例如: public class Thread8 extends Thread { public void sync_fun() { s ...
- 转 Dock 外 命令解析
RUN vs CMD vs ENTRYPOINT - 每天5分钟玩转 Docker 容器技术(17) 小结: run 主要是安装镜像,安装软件. CMD 设置容器启动后默认执行的命令及其参数,但 CM ...
- jmeter(一)工具介绍(一)
一.JMeter 介绍 Apache JMeter是100%纯JAVA桌面应用程序,被设计为用于测试客户端/服务端结构的软件(例如web应用程序).它可以用来测试静态和动态资源的性能,例如:静态文件, ...
- Windows 7操作系统下Apache的安装与配置(图文详解)
我这里是 Apache2.4.X-win64 首先, 我的操作系统信息如下 Apache2.4-win64的下载 官网 http://www.apachelounge.com/download/ 因 ...
- javascript 笔记--变量
用了这么久的Javascript,该总结下了!温故而知新! var 声明变量: javascript 是弱类型语言,因此无需为声明对象明确类型声明. 如:var test="字符串" ...
- hihocoder1705 座位问题
思路: 使用堆模拟.复习了priority_queue自定义结构体比较函数的用法. 实现: #include <bits/stdc++.h> using namespace std; ty ...
- ES5之变量
什么是变量:存放物体的一个容器,以便后续利用该容器存放的物体. 变量的声明及赋值: 声明变量关键字var; 变量名的规范:变量名由英文字母.数字.下划线.美元符号组成,但是首字母只能是英文字母.下划线 ...