知识点

这节课主要讲解用递归的方法,实现汉诺塔的解答

对于游戏的玩法,我们可以简单分解为三个步骤:

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)--递归:汉诺塔的更多相关文章

  1. 《零基础入门学习Python》【第一版】视频课后答案第001讲

    测试题答案: 0. Python 是什么类型的语言? Python是脚本语言 脚本语言(Scripting language)是电脑编程语言,因此也能让开发者藉以编写出让电脑听命行事的程序.以简单的方 ...

  2. 【Python教程】《零基础入门学习Python》(小甲鱼)

    [Python教程]<零基础入门学习Python>(小甲鱼) 讲解通俗易懂,诙谐. 哈哈哈. https://www.bilibili.com/video/av27789609

  3. 零基础入门学习Python(1)--我和Python的第一次亲密接触

    前言 最近在学习Python编程语言,于是乎就在网上找资源.其中小甲鱼<零基础入门学习Python>试听了几节课,感觉还挺不错,里面的视频都是免费下载,小甲鱼讲话也挺幽默风趣的,所以呢,就 ...

  4. 学习参考《零基础入门学习Python》电子书PDF+笔记+课后题及答案

    国内编写的关于python入门的书,初学者可以看看. 参考: <零基础入门学习Python>电子书PDF+笔记+课后题及答案 Python3入门必备; 小甲鱼手把手教授Python; 包含 ...

  5. 学习《零基础入门学习Python》电子书PDF+笔记+课后题及答案

    初学python入门建议学习<零基础入门学习Python>.适合新手入门,很简单很易懂.前一半将语法,后一半讲了实际的应用. Python3入门必备,小甲鱼手把手教授Python,包含电子 ...

  6. 零基础入门学习Python(22)--函数:递归是神马

    知识点 递归是神马? 递归是属于算法的范畴. 递归就是函数调用自身的一种行为. >>> def g(): return g() >>> g() Traceback ...

  7. 【Python学习之七】递归——汉诺塔问题的算法理解

    汉诺塔问题 汉诺塔的移动可以用递归函数非常简单地实现.请编写move(n, a, b, c)函数,它接收参数n,表示3个柱子A.B.C中第1个柱子A的盘子数量,然后打印出把所有盘子从A借助B移动到C的 ...

  8. 零基础入门学习Python(36)--类和对象:给大家介绍对象

    知识点 Python3 面向对象 Python从设计之初就已经是一门面向对象的语言,正因为如此,在Python中创建一个类和对象是很容易的.本章节我们将详细介绍Python的面向对象编程. 如果你以前 ...

  9. 零基础入门学习Python(17)--函数:Python的乐高积木

    前言 相信大家小时候都玩过神奇的乐高积木, 只要通过想象力和创造力我们可以拼凑很多神奇的东西,那么随着我们学习的深入,我们编写的Python代码也将日益增加,并且也越来越复杂, 所以呢,我们需要找寻一 ...

随机推荐

  1. 洛谷 P2763 试题库问题【最大流】

    s向所有类别属性连流量为当前类别属性需要的个数的边,所有题目向t连流量为1的边(表示只能选一次),所有属性向含有它的题连容量为1的边.跑一变dinic,结果小于m则无解,否则看每一个类别属性连出去的题 ...

  2. springboot(九) Cache缓存和Redis缓存

    1. Cache缓存 1.1 缓存的概念&缓存注解 Cache 缓存接口,定义缓存操作.实现有:RedisCache.EhCacheCache.ConcurrentMapCache等 Cach ...

  3. IIS重新注册

    打开程序-运行-cmd:输入一下命令重新注册IISC:\WINDOWS\Microsoft.NET\Framework\v4.0.30319\aspnet_regiis.exe -i

  4. Python添加自己的模块路径

    进入Python编辑环境后可以,通过Python的sys.path属性获得当前搜索路径的配置,可以看到之前我们设置的路径已经在当前搜索路径中了. 然后通过sys.path.append('F:\Pyt ...

  5. bzoj258 [USACO 2012 Jan Gold] Bovine Alliance【巧妙】

    传送门1:http://www.usaco.org/index.php?page=viewproblem2&cpid=111 传送门2:http://www.lydsy.com/JudgeOn ...

  6. EL表达式、JSTL

    EL表达式 一.简介 > JSP表达式 <%= %> 用于向页面中输出一个对象.        > 到JSP2.0时,在我们的页面中不允许出现 JSP表达式和 脚本片段.   ...

  7. Python学习 Day 2-数据类型和变量

    数据类型和变量 在Python中,能够直接处理的数据类型有以下几种: 整数 Python可以处理任意大小的整数,当然包括负整数,在程序中的表示方法和数学上的写法一模一样,例如:1,100,-8080, ...

  8. Nodejs AES加密不一致问题的解决

    最近在做android游戏,客户端与Nodejs服务端数据的交互用AES进行加密,发现Nodejs与java的加密形式不一样.查询N久资料发现java端需要对密钥再MD5加密一遍(我了个大擦),本来对 ...

  9. CAS介绍

    1.概述 单点登录(Single Sign On),简称为 SSO,是目前比较流行的企业业务整合的解决方案之一.SSO的定义是在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统. 耶 ...

  10. 字符串(String)几个常用方法的详解

    String:(字符串) indexOf() 方法可返回某个指定的字符串值在字符串中首次出现的位置. stringObject.indexOf(searchvalue,fromindex) searc ...