热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

递归与非递归python

面试题中很多都涉及到递归与非递归,比如二分法,冒泡,归并,快排,二叉树前中后遍历等等,建议能直接

面试题中很多都涉及到递归与非递归,比如二分法,冒泡,归并,快排,二叉树前中后遍历等等,建议能直接给出非递归形式,如果面试官想要看到递归形式也能熟练的写出来。

典型的面试题比如说:汉诺塔问题,斐波那契数列等

递归是什么?和循环的区别

答:

递归从字面意思理解是自己调用自己,实际上递归是将问题逐渐分解减小,但是和原问题有着相同解法的问题,并且存在一个问题的出口。

循环就是重复执行同一段代码

打一个比方吧,从前有座山,山里有座庙,庙里有个老和尚和小和尚,老和尚对小和尚说,从前有座山,山里有座庙,庙里有个老和尚和小和尚,老和尚对小和尚说,从前有座山,山里有座庙,庙里有个老和尚和小和尚,老和尚对小和尚说...... 这就是递归,循环就是 从前有座山,山里有座庙,庙里有个老和尚和小和尚。从前有座山,山里有座庙,庙里有个老和尚和小和尚。从前有座山,山里有座庙,庙里有个老和尚和小和尚。从前有座山,山里有座庙,庙里有个老和尚和小和尚。从前有座山,山里有座庙,庙里有个老和尚和小和尚。

循环和递归存在相似性但是存在本质的不同,比如都是重复操作,但是循环是一次正向的过程,递归却需要回溯。

理论上所有的递归都可以变成非递归形式,比如使用栈和循环。但是循环却不能改成递归

尾递归优化:

一些语言在编译或者解释的时候能够自动对尾递归形式进行优化,但是python并不能,所以在python中将递归改成尾递归形式仍然不能改变递归的效率差和爆栈的问题。

针对尾递归优化的语言可以通过尾递归防止栈溢出。尾递归事实上和循环是等价的,没有循环语句的编程语言只能通过尾递归实现循环。

递归效率低的原因:

递归的简单理解:

递归就是自己调用自己,

递归的总结:


  • 找到递归出口(终止递归的条件)
  • 找出递归表达式(规律)

下面这个就是用递归的方式计算阶乘

首先是递归的出口 n = 1

递归表达式 fact(n) = n * fact(n-1)

===> fact(5)
===> 5 * fact(4)
===> 5 * (4 * fact(3))
===> 5 * (4 * (3 * fact(2)))
===> 5 * (4 * (3 * (2 * fact(1))))
===> 5 * (4 * (3 * (2 * 1)))
===> 5 * (4 * (3 * 2))
===> 5 * (4 * 6)
===> 5 * 24
===> 120

递归的缺点:

递归的缺点有两个,首先是时间效率低,需要一个展开和回溯的过程,改成循环的方式就可以避免展开的过程,其次是用栈的问题,python的递归深度最大是1000,win10系统是2MB大小,(使用ulimit -a命令查看大小限制),受限于这两种限制,使用递归就容易出现爆栈的问题。

递归改非递归:

使用栈来模拟递归展开和回溯的过程,可以避免爆栈的问题

在支持尾递归优化的语言中可以将递归改成尾递归的形式

漫谈递归转非递归 - 猿大白 - 博客园本文首发于我的公众号 Linux云计算网络(id: cloud_dev) ,专注于干货分享,号内有 10T 书籍和视频资源,后台回复 「1024」 即可领取,欢迎大家关注,二维码文末可以扫。 一:递归https://www.cnblogs.com/bakari/p/5349383.html

 递归对应的一些常见算法题

题1:计算n的阶乘

首先分析n的阶乘的一般形式是 f(n) = 1*2*.....*n

从中可以得到

f(1) = 1              递归的出口

f(n) = n * f(n-1)  递归的规律表达式

由此就可以得出递归的解法

def func(num):if num == 1:return 1else:return num * func(num-1)

python语言的话因为没有尾递归优化,所以不用考虑通过优化成尾递归的形式避免栈溢出,不过可以通过这个了解下尾递归的事情

首先尾递归是有严格规定的,不是说递归函数最后一行调用自己的函数就一定是尾递归,比如这个函数最后虽然调用了自己,但是它不是尾递归,尾递归要求在最后return自己时不能有表达式,是直接return自己

所以以上的函数为了改成尾递归的形式,可以这样调整

def func(num,temp):if num == 1:return tempelse:return func(num-1,temp * num)

以上的函数是一种尾递归优化,每次调用的时候,实际上已经将阶乘的值传递给了下一个值

这个函数的展开就没有回溯的过程。但是python仍有栈溢出的问题,所以python中改成尾递归不如将递归直接改成非递归的形式。

当然这道题也有非递归的解法,直接改成循环的形式即可:

def func(num):temp = 1while(num):temp = temp * numnum = num - 1return temp

也可以强行套公式去转换成非递归形式,类似这样,用栈去记录每一次本来需要递归中栈记录得参数:

def func(num):stack = list()while(num):stack.append(num)num = num - 1temp = 1while(stack):temp = stack.pop() * tempreturn temp


推荐阅读
  • 本文介绍了Java的集合及其实现类,包括数据结构、抽象类和具体实现类的关系,详细介绍了List接口及其实现类ArrayList的基本操作和特点。文章通过提供相关参考文档和链接,帮助读者更好地理解和使用Java的集合类。 ... [详细]
  • 本文介绍了计算机网络的定义和通信流程,包括客户端编译文件、二进制转换、三层路由设备等。同时,还介绍了计算机网络中常用的关键词,如MAC地址和IP地址。 ... [详细]
  • 本文比较了eBPF和WebAssembly作为云原生VM的特点和应用领域。eBPF作为运行在Linux内核中的轻量级代码执行沙箱,适用于网络或安全相关的任务;而WebAssembly作为图灵完备的语言,在商业应用中具有优势。同时,介绍了WebAssembly在Linux内核中运行的尝试以及基于LLVM的云原生WebAssembly编译器WasmEdge Runtime的案例,展示了WebAssembly作为原生应用程序的潜力。 ... [详细]
  • 阿里Treebased Deep Match(TDM) 学习笔记及技术发展回顾
    本文介绍了阿里Treebased Deep Match(TDM)的学习笔记,同时回顾了工业界技术发展的几代演进。从基于统计的启发式规则方法到基于内积模型的向量检索方法,再到引入复杂深度学习模型的下一代匹配技术。文章详细解释了基于统计的启发式规则方法和基于内积模型的向量检索方法的原理和应用,并介绍了TDM的背景和优势。最后,文章提到了向量距离和基于向量聚类的索引结构对于加速匹配效率的作用。本文对于理解TDM的学习过程和了解匹配技术的发展具有重要意义。 ... [详细]
  • 本文介绍了lua语言中闭包的特性及其在模式匹配、日期处理、编译和模块化等方面的应用。lua中的闭包是严格遵循词法定界的第一类值,函数可以作为变量自由传递,也可以作为参数传递给其他函数。这些特性使得lua语言具有极大的灵活性,为程序开发带来了便利。 ... [详细]
  • 本文介绍了在Python3中如何使用选择文件对话框的格式打开和保存图片的方法。通过使用tkinter库中的filedialog模块的asksaveasfilename和askopenfilename函数,可以方便地选择要打开或保存的图片文件,并进行相关操作。具体的代码示例和操作步骤也被提供。 ... [详细]
  • 云原生边缘计算之KubeEdge简介及功能特点
    本文介绍了云原生边缘计算中的KubeEdge系统,该系统是一个开源系统,用于将容器化应用程序编排功能扩展到Edge的主机。它基于Kubernetes构建,并为网络应用程序提供基础架构支持。同时,KubeEdge具有离线模式、基于Kubernetes的节点、群集、应用程序和设备管理、资源优化等特点。此外,KubeEdge还支持跨平台工作,在私有、公共和混合云中都可以运行。同时,KubeEdge还提供数据管理和数据分析管道引擎的支持。最后,本文还介绍了KubeEdge系统生成证书的方法。 ... [详细]
  • 本文介绍了数据库的存储结构及其重要性,强调了关系数据库范例中将逻辑存储与物理存储分开的必要性。通过逻辑结构和物理结构的分离,可以实现对物理存储的重新组织和数据库的迁移,而应用程序不会察觉到任何更改。文章还展示了Oracle数据库的逻辑结构和物理结构,并介绍了表空间的概念和作用。 ... [详细]
  • 目录实现效果:实现环境实现方法一:基本思路主要代码JavaScript代码总结方法二主要代码总结方法三基本思路主要代码JavaScriptHTML总结实 ... [详细]
  • 如何用UE4制作2D游戏文档——计算篇
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了如何用UE4制作2D游戏文档——计算篇相关的知识,希望对你有一定的参考价值。 ... [详细]
  • 本文介绍了PhysioNet网站提供的生理信号处理工具箱WFDB Toolbox for Matlab的安装和使用方法。通过下载并添加到Matlab路径中或直接在Matlab中输入相关内容,即可完成安装。该工具箱提供了一系列函数,可以方便地处理生理信号数据。详细的安装和使用方法可以参考本文内容。 ... [详细]
  • Voicewo在线语音识别转换jQuery插件的特点和示例
    本文介绍了一款名为Voicewo的在线语音识别转换jQuery插件,该插件具有快速、架构、风格、扩展和兼容等特点,适合在互联网应用中使用。同时还提供了一个快速示例供开发人员参考。 ... [详细]
  • 计算机存储系统的层次结构及其优势
    本文介绍了计算机存储系统的层次结构,包括高速缓存、主存储器和辅助存储器三个层次。通过分层存储数据可以提高程序的执行效率。计算机存储系统的层次结构将各种不同存储容量、存取速度和价格的存储器有机组合成整体,形成可寻址存储空间比主存储器空间大得多的存储整体。由于辅助存储器容量大、价格低,使得整体存储系统的平均价格降低。同时,高速缓存的存取速度可以和CPU的工作速度相匹配,进一步提高程序执行效率。 ... [详细]
  • 本文介绍了在Windows环境下如何配置php+apache环境,包括下载php7和apache2.4、安装vc2015运行时环境、启动php7和apache2.4等步骤。希望对需要搭建php7环境的读者有一定的参考价值。摘要长度为169字。 ... [详细]
  • 本文由编程笔记#小编为大家整理,主要介绍了StartingzookeeperFAILEDTOSTART相关的知识,希望对你有一定的参考价值。下载路径:https://ar ... [详细]
author-avatar
手机用户2602933853
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有