python学习-递归(阶乘、汉诺塔)
文章目录
- 求阶乘(循环)
- 求阶乘(递归)
- 汉诺塔
求阶乘(循环)
如果需要求一个数的阶乘,可能刚开始脑海里面冒出来的是循环计算,下面看看循环如何实现:
def recur1(num):rst1 = 1for item in range(1, num + 1):print(item)rst1 = rst1 * itemprint(rst1)return rst1recur1(5)
为了体现变化,我这里把每个值都打印出来了。
运行结果:
1 * 2 * 3 * 4 * 5 = 120
求阶乘(递归)
如果不使用循环,我们可以使用递归的方式,下面解释一下递归的定义:
递归算法(英语:recursion algorithm)在计算机科学中指一种通过重复而将问题分解为同类的子问题来解决问题的方法。
使用递归式方法可以解决很多的计算机科学的问题,它是计算机科学中十分重要的概念。绝大多数编程语言支持函数的自调用,因此在这些语言中函数可以通过调用自身来进行递归。
计算理论可以证明递归的作用完全可以取代循环,在很多函数编程语言(如Scheme)中习惯用递归来实现循环。
这段话摘抄自百度词条,也是为了让自己更清楚递归的含义。
下面来看实现:
def recur2(num):if num == 1:return numreturn num * recur2(num - 1)print(recur2(5))
运行结果:120
在示例中我们能看到,代码比使用循环简洁了不少,而且意义更明了。
下面这段话也要注意:
基线条件(base case)。基线条件是递归程序的最底层位置,在此位置时没有必要再进行操作,可以直接返回一个结果。
所有递归程序都必须至少拥有一个基线条件,而且必须确保它们最终会达到某个基线条件;否则,程序将永远运行下去,直到程序缺少内存或者栈空间。
推荐另一篇关于递归的文章,写得很详细,也很用心,如果我的博文有幸被你们看到,那可以去看看他的这篇:Python递归算法详解
写得很详细的,内容更丰富。
默认的Python有一个可用的递归深度的限制,以避免耗尽计算机中的内存。默认是1000。
当然递归的优点和缺点都是很明显的,从刚才推荐的这篇博文里面截了一张图,大家可以看看。
汉诺塔
有一座钻石宝塔A,其上有64个金蝶。所有碟子按从大到小的次序从塔底堆放至塔顶。紧挨着这座塔有另外两个钻石宝塔B和C。每次只能移动一个碟子,任何时候都不能把一个碟子放在比它小的碟子上面。把A上的碟子全部移到C上。
这个如果不用递归,实现起来,难度太大,毕竟次数太多了。
使用递归看着就会很简单了,上代码:
使用递归解决问题,首先需要化繁为简,简化步骤,明确要实现的功能。
def Hanoi(n, A, B, C) :if (n == 1) :move(A, c) #表示只有一个碟子时,直接从A塔移动到C塔else :Hanoi(n - 1, A, C, B) #将剩下的A塔上的n-1借助C塔移动到B塔move(A, C) #将A上最后一个直接移动到C塔上Hanoi(n - 1, B, A, C) #将B塔上的n-1个碟子借助A塔移动到C塔
这段代码就是对汉诺塔使用递归实现的一种解析,综合起来分成三步。
实现代码:
iBeg = 1def move(iNum, frm, to):global iBeg# print("第%d步:将%d号盘子从%s -> %s" % (iBeg, iNum, frm, to))iBeg += 1def hanoi(iNum, a, b, c):if iNum == 1:move(1, a, c)else:hanoi(iNum - 1, a, c, b)move(iNum, a, c)hanoi(iNum - 1, b, a, c)iNum = int(input("请输入一个数字:"))
if isinstance(iNum, int):if 0 > iNum or iNum > 64:print("请输入一个0-64之间的整数!")else:hanoi(iNum, 'A', 'B', 'C')print("移动步数:", iBeg)
else:print("请输入一个整数!")
大家可以自己运行试试,move函数里面有个注释,如果运行数字比较小,10以内,那就可以放开注释,看看运行步骤。如果数字较大,还是直接运行吧。
如果大家电脑性能不太好,那还是不要尝试64个盘子的汉诺塔了,太耗时
本来想测试一下64个盘子要循环多少次,不过跑了一个小时还没跑出来。10,20都能很快跑出结果,30跑了几分钟,运行出结果了:
下面这张图是比较直观的一种方式,在ppt里面,插入这几个形状,然后自己挪动一下,从A按步骤,挪动到C,对这个思路就比较的清晰了。
还有一个斐波拉契数列,这个递归实现网上很多,我这里没有去自己实现,所以不贴代码了。
python学习-递归(阶乘、汉诺塔)相关推荐
- python入门递归之汉诺塔
def hani(n,x,y,z): if n == 1 : print(x ,"-->",z) else: hani(n-1,x,z,y)#将n-1个盘子从x移到y pri ...
- python面向过程实践汉诺塔_递归汉诺塔-和递归汉诺塔相关的内容-阿里云开发者社区...
多柱汉诺塔最优算法设计探究 多柱汉诺塔最优算法设计探究 引言 汉诺塔算法一直是算法设计科目的最具代表性的研究问题,本文关注于如何设计多柱汉诺塔最优算法的探究.最简单的汉诺塔是三个柱子(A.B.C),因 ...
- Python递归实现汉诺塔
Python递归实现汉诺塔: def f3(n,x,y,z): if(n==1):print(x,'--->',z)else:f3(n-1,x,z,y)print(x,'--->',z)f ...
- c语言 统计数量用count_C语言编程学习之递归实现汉诺塔图解!还有零基础入门视频~...
C语言是面向过程的,而C++是面向对象的 C和C++的区别: C是一个结构化语言,它的重点在于算法和数据结构.C程序的设计首要考虑的是如何通过一个过程,对输入(或环境条件)进行运算处理得到输出(或实现 ...
- python实现汉诺塔递归经典算法_Python递归实现汉诺塔算法示例
本文实例讲述了Python递归实现汉诺塔算法.分享给大家供大家参考,具体如下: 最近面试题,面试官让我5分钟实现汉诺塔算法(已然忘记汉诺塔是啥). 痛定思痛,回来查了一下汉诺塔的题目和算法.题干与实现 ...
- 【python】 turtle实现汉诺塔游戏动画过程
[python] turtle实现汉诺塔游戏动画过程 import turtle class Stack: #面向对象,定义一个类def __init__(self):self.items = []d ...
- C语言——生存期和存储类型、递归、递归求解汉诺塔、快速排序
目录 一.生存期和存储类型 1.生存期 2.存储类型 3.自动变量(auto) 4.寄存器变量(register) 5.静态局部变量(static) 6.static 和 extern 二.递归 1. ...
- Py:递归求解汉诺塔,简单的几行编程可以搞定很高层的三柱汉诺塔游戏
Py:递归求解汉诺塔,简单的几行编程可以搞定很高层的三柱汉诺塔游戏 目录 输出结果 核心代码 输出结果 核心代码 def hanoi(n,x,y,z):if n==1:print(x,'--→',z) ...
- c语言递归汉诺塔次数,c语言递归解决汉诺塔参数变化的疑惑
c语言递归解决汉诺塔参数变化的疑惑 答案:3 信息版本:手机版 解决时间 2020-04-05 14:20 已解决 2020-04-05 10:49 #include void main() {vo ...
- c语言递归解决汉诺塔问题
c语言递归解决汉诺塔问题 参考文章: (1)c语言递归解决汉诺塔问题 (2)https://www.cnblogs.com/didiaoxiaoguai/p/6686407.html 备忘一下.
最新文章
- PAT Basic 1069. 微博转发抽奖(20)
- Selenium高亮页面对象
- oracle 10g学习之分组函数
- java制作扫雷游戏中埋雷的难点_月薪30K程序员花了一个小时,用c++做出经典扫雷游戏 !...
- 潭州课堂25班:Ph201805201 django框架 第五课 自定义简单标签,包含标签,模型类创建,梳理类创建 (课堂笔记)...
- 软件测试--中间件介绍
- velocity mybatis spring 在maven的整合开发(四)
- 微信小程序可滑动周日历组件
- 快速打开ofd文件发票转换pdf格式发票方法
- codesys file读写配置参数程序
- FoxBarcode(一维码生成库)使用教程
- Android 获取当前地理位置信息
- CleanMyMac XMac苹果电脑专属系统优化工具
- POI解决读入Excel内存溢出
- 【OPENCV_系列电子PDF图书连载】计算机视觉从入门到精通完整学习路线专栏
- Python使用逻辑回归提示FutureWarning: Default solver will be changed to ‘lbfgs‘ in 0.22. Specify a solver to
- qnap备份文件服务器,完整的数据备份方案
- mysql带where的join加索引_MySQL索引分析和优化+JOIN的分类(转)
- scanf在c语言中的作用,c语言中scanf的基本用法
- Keso眼中的移动互联网罗生门
热门文章
- SAP UI5 初学者教程之五:视图控制器初探 试读版
- 什么是 ABAP Field Symbol
- 动手开发第一个 Cypress 测试应用
- JavaScript, ABAP和Scala里的尾递归(Tail Recursion)
- Angular元素属性绑定的一个例子
- Angular jasmine单元测试框架spied method的调用记录数据结构
- SAP Spartacus如何启用B2B feature
- 通过运行时单步调试弄清楚[(ngModel)]的双向绑定的工作原理
- SAP Spartacus 最后渲染出的页面和后台 CMS 页面元数据的一一对应
- WordPress Kyma插件里Connect和disconnect按钮的动态显示逻辑