知识点

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

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

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上。

用递归方法实现

  1. #汉诺塔
  2. def hanoi(n,x,y,z):
  3. if n == 1:
  4. print(x,'-->移动至',z)
  5. else:
  6. hanoi(n-1,x,z,y)#将前n-1个盘从x移动至y
  7. print(x,'-->移动至',z)#将最底下一个盘从x移动至z
  8. hanoi(n-1,y,x,z)#将y上的n-1个盘从y移动至z
  9. n = int(input('请输入汉诺塔的层数:'))
  10. hanoi(n,'A','B','C')
  11. ================= RESTART: C:\Users\ThinkPad\Desktop\test.py =================
  12. 请输入汉诺塔的层数:5
  13. A -->移动至 C
  14. A -->移动至 B
  15. C -->移动至 B
  16. A -->移动至 C
  17. B -->移动至 A
  18. B -->移动至 C
  19. A -->移动至 C
  20. A -->移动至 B
  21. C -->移动至 B
  22. C -->移动至 A
  23. B -->移动至 A
  24. C -->移动至 B
  25. A -->移动至 C
  26. A -->移动至 B
  27. C -->移动至 B
  28. A -->移动至 C
  29. B -->移动至 A
  30. B -->移动至 C
  31. A -->移动至 C
  32. B -->移动至 A
  33. C -->移动至 B
  34. C -->移动至 A
  35. B -->移动至 A
  36. B -->移动至 C
  37. A -->移动至 C
  38. A -->移动至 B
  39. C -->移动至 B
  40. A -->移动至 C
  41. B -->移动至 A
  42. B -->移动至 C
  43. A -->移动至 C

课后习题

动动手

  • 使用递归编写一个十进制转换二进制的函数(要求采用“除2取余”的方式,结果与调用bin()一样返回字符串形式)
  1. #迭代形式
  2. def Dec2Bin(dec):
  3. temp = []
  4. result =''
  5. while dec:
  6. x = dec % 2
  7. dec //= 2
  8. temp.append(x)
  9. while temp:
  10. result += str(temp.pop())
  11. return result
  12. print(Dec2Bin(10))
  13. ================= RESTART: C:\Users\ThinkPad\Desktop\test.py =================
  14. 1010
  15. #递归形式
  16. def Dec2Bin(dec):
  17. result = ''
  18. if dec:
  19. result = Dec2Bin(dec//2)
  20. return result + str(dec%2)
  21. else:
  22. return result
  23. print(Dec2Bin(10))
  24. ================= RESTART: C:\Users\ThinkPad\Desktop\test.py =================
  25. 1010
  26. >>>
  • 写一个函数get_digits(n),将参数n分解出每个位的数字并按顺序存放到列表中。举例:get_digits(12345) ==> [1,2,3,4,5]
  1. result = []
  2. def get_digits(n):
  3. if n > 0:
  4. result.insert(0,n%10)
  5. get_digits(n//10)
  6. #result.sort()
  7. get_digits(512364)
  8. print(result)
  9. ================= RESTART: C:\Users\ThinkPad\Desktop\test.py =================
  10. [5, 1, 2, 3, 6, 4]
  • 还记得求回文联字符串那道题吗?现在让你使用递归的方式求解?
  1. def is_palindrome(n, start, end):
  2. if start > end:
  3. return 1
  4. else:
  5. return is_palindrome(n, start+1, end-1) if n[start] == n[end] else 0
  6. string = input('请输入一串字符串:')
  7. length = len(string)-1
  8. if is_palindrome(string, 0, length):
  9. print('\"%s\"是回文字符串!' % string)
  10. else:
  11. print('\"%s\"不是回文字符串!' % string)

使用递归编程求解以下问题:

有5个人坐在一起,问第五个人多少岁?他说比第4个人大2岁。问第4个人岁数,他说比第三个人大2岁。问第三个人,又说比第二个人大2岁。问第2个人,说比第一个人大2岁。最后问第一个人,他说是10岁。请问第五个人多大?

  1. def age(n):
  2. if n == 1:
  3. return 10
  4. else:
  5. return age(n-1) + 2
  6. 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. 【黑金教程笔记之004】【建模篇】【Lab 03 消抖模块之一】—笔记

    设计思路: (1)       一旦检测到按键资源按下(从高电平到低电平),“电平检测模块”就会拉高H2L_Sig电平,然后拉低. (2)       “10ms延迟模块”检测到H2L_Sig高电平, ...

  2. WCF、WebAPI、WebService之间的区别

    Web Service 1.它是基于SOAP协议的,数据格式是XML 2.只支持HTTP协议 3.它不是开源的,但可以被任意一个了解XML的人使用 4.它只能部署在IIS上 WCF 1.这个也是基于S ...

  3. 升级Python后, yum不能用了

    yum需要使用python2,而升级python3后,就会导致语法错误 更正方法: sudo vim /usr/bin/yum 然后把第一行的python改成python2就好了 之后如果出现类似的, ...

  4. saltstack实战笔记

    #运维管理工具 ansible #支持ssh,不需要客户端 saltstack #也是只是ssh,不需要客户端的 安装架构是,master /minion 安装salt的依赖模块 python zer ...

  5. LBP特征 学习笔记

    这几天一直在做人脸识别的项目,有用到LBP特征,但是毫无头绪,师姐这几天也比较忙,没有时间来指导我,随自己找相应的介绍LBP的博文来看,现在总算有了一个大体的思路了,就写下来吧 注:参考博文: 目标检 ...

  6. hdu 1863 畅通工程(Kruskal+并查集)

    畅通工程 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submi ...

  7. 暴力 hihoCoder 1178 计数

    题目传送门 /* 暴力:这题真是醉了,直接暴力竟然就可以了!复杂度不会分析,不敢写暴力程序.. 枚举x,在不重复的情况下+ans,超过范围直接break */ #include <cstdio& ...

  8. 题解报告:hdu 1059 Dividing(多重背包、多重部分和问题)

    Problem Description Marsha and Bill own a collection of marbles. They want to split the collection a ...

  9. 里氏替换原则中is和as分别的作用

    is 是用于检查对象是否指定类型兼容 if(empls[i] is SE){ ((SE)empls).SayHi(); } as 不用强转可以直接转换 if(empls[i] is SE){ SE s ...

  10. jQuery 几款比较棒的插件

    jQuery滚动监听插件Waypoints 博客分类: Javascript /Jquery / Bootstrap / Web   你是否希望当用户仅仅滚动滑条的时候,就能触发各种各样的动态效果呢? ...