热门标签 | 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


推荐阅读
  • 本文作者分享了在阿里巴巴获得实习offer的经历,包括五轮面试的详细内容和经验总结。其中四轮为技术面试,一轮为HR面试,涵盖了大量的Java技术和项目实践经验。 ... [详细]
  • 使用Numpy实现无外部库依赖的双线性插值图像缩放
    本文介绍如何仅使用Numpy库,通过双线性插值方法实现图像的高效缩放,避免了对OpenCV等图像处理库的依赖。文中详细解释了算法原理,并提供了完整的代码示例。 ... [详细]
  • 1:有如下一段程序:packagea.b.c;publicclassTest{privatestaticinti0;publicintgetNext(){return ... [详细]
  • 自学编程与计算机专业背景者的差异分析
    本文探讨了自学编程者和计算机专业毕业生在技能、知识结构及职业发展上的不同之处,结合实际案例分析两者的优势与劣势。 ... [详细]
  • Hadoop入门与核心组件详解
    本文详细介绍了Hadoop的基础知识及其核心组件,包括HDFS、MapReduce和YARN。通过本文,读者可以全面了解Hadoop的生态系统及应用场景。 ... [详细]
  • FinOps 与 Serverless 的结合:破解云成本难题
    本文探讨了如何通过 FinOps 实践优化 Serverless 应用的成本管理,提出了首个 Serverless 函数总成本估计模型,并分享了多种有效的成本优化策略。 ... [详细]
  • 尽管深度学习带来了广泛的应用前景,其训练通常需要强大的计算资源。然而,并非所有开发者都能负担得起高性能服务器或专用硬件。本文探讨了如何在有限的硬件条件下(如ARM CPU)高效运行深度神经网络,特别是通过选择合适的工具和框架来加速模型推理。 ... [详细]
  • 2018-2019学年第六周《Java数据结构与算法》学习总结
    本文总结了2018-2019学年第六周在《Java数据结构与算法》课程中的学习内容,重点介绍了非线性数据结构——树的相关知识及其应用。 ... [详细]
  • 在Linux系统中配置并启动ActiveMQ
    本文详细介绍了如何在Linux环境中安装和配置ActiveMQ,包括端口开放及防火墙设置。通过本文,您可以掌握完整的ActiveMQ部署流程,确保其在网络环境中正常运行。 ... [详细]
  • 2023年京东Android面试真题解析与经验分享
    本文由一位拥有6年Android开发经验的工程师撰写,详细解析了京东面试中常见的技术问题。涵盖引用传递、Handler机制、ListView优化、多线程控制及ANR处理等核心知识点。 ... [详细]
  • 本文详细介绍了如何在Ubuntu系统中下载适用于Intel处理器的64位版本,涵盖了不同Linux发行版对64位架构的不同命名方式,并提供了具体的下载链接和步骤。 ... [详细]
  • 本文介绍如何使用Python进行文本处理,包括分词和生成词云图。通过整合多个文本文件、去除停用词并生成词云图,展示文本数据的可视化分析方法。 ... [详细]
  • 深入解析:阿里实战 SpringCloud 微服务架构与应用
    本文将详细介绍 SpringCloud 在微服务架构中的应用,涵盖入门、实战和案例分析。通过丰富的代码示例和实际项目经验,帮助读者全面掌握 SpringCloud 的核心技术和最佳实践。 ... [详细]
  • 探索电路与系统的起源与发展
    本文回顾了电路与系统的发展历程,从电的早期发现到现代电子器件的应用。文章不仅涵盖了基础理论和关键发明,还探讨了这一学科对计算机、人工智能及物联网等领域的深远影响。 ... [详细]
  • 2018年3月31日,CSDN、火星财经联合中关村区块链产业联盟等机构举办的2018区块链技术及应用峰会(BTA)核心分会场圆满举行。多位业内顶尖专家深入探讨了区块链的核心技术原理及其在实际业务中的应用。 ... [详细]
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社区 版权所有