知识点

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

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

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. HDU 2914 Triangle (Fibnacci 数)

    题意:给你一个长度为 n 的木棒,求至少拿掉几根使得剩余的木棒构成不了三角形. 析:为了保证不形成三角形,所以保证两边之和等于最大边是最优,这不就是Fibnacci 数么,由于 n 很小,if-els ...

  2. Linux strace命令(转载)

    转载:http://www.cnblogs.com/ggjucheng/archive/2012/01/08/2316692.html 简介 strace常用来跟踪进程执行时的系统调用和所接收的信号. ...

  3. python 面向对象六 动态添加方法 __slots__限制动态添加方法

    一.动态添加属性 >>> class Student(object): pass >>> st = Student() >>> st.name = ...

  4. bzoj 3875: [Ahoi2014&Jsoi2014]骑士游戏【dp+spfa】

    设f[i]为杀死i的最小代价,显然\( f[i]=min(k[i],s[i]+\sum f[to]) \) 但是这个东西有后效性,所以我们使用spfa来做,具体就是每更新一个f[i],就把能被它更新的 ...

  5. 在myeclipse中maven遇见的问题

    An internal error occurred during: "Retrieving archetypes:". Java heap space 表示你的myeclipse ...

  6. Lightoj 1071 - Baker Vai (双线程DP)

    题目连接: http://lightoj.com/volume_showproblem.php?problem=1071 题目大意: 一个n*m的格子,Baker Vai要从(1,1)到(n,m)再回 ...

  7. [USACO 2012 Mar Gold] Large Banner

    传送门:http://www.usaco.org/index.php?page=viewproblem2&cpid=127 又是一道这种题目,遇到一次跪一次,这次终于硬着头皮看懂了题解,但是谢 ...

  8. Java Annontation(注解)详解

    java中经常用到注解(Annontation),索性整理了下关于注解的相关知识点: 一.概念 Annontation是Java5开始引入的新特征,类似与.NET 中的attribute.中文名称一般 ...

  9. java 字符串的比较compareTo

    import java.util.Scanner; public class Demo01 { public static void main(String[] args) {     Scanner ...

  10. Snort里如何将读取的包记录存到指定的目录下(图文详解)

    不多说,直接上干货! 比如,在/root/log目录下. [root@datatest ~]# snort -dve -l /root/log 需要注意: 1) /log目录需要你自己建立,并修改权限 ...