谈一谈|return None来看递归函数流程解析

本文涉及的产品
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
全局流量管理 GTM,标准版 1个月
云解析 DNS,旗舰版 1个月
简介: 谈一谈|return None来看递归函数流程解析

1 前言

递归函数的概念很简单,就是函数调用本身。但在实际接触递归函数时,往往不知道怎么下手,在其中碰到的问题也不知道如何解决,比如明明可以print却无法return有效值,根本原因就是不知道递归函数在运行时的具体情况,借着这篇文章,来看看递归函数究竟是怎么回事吧。


2 案例解析

以常见的斐波拉契数列为例,第n项斐波拉契数等于第n-1项和第n-2项斐波拉契数的和。通过一个for循环就能轻易的得到第n项斐波拉契数。

fl=1

fn=1

for i in range(3,n+1):

    mid=fl

    fl=fn

    fn=fl+mid

print(fn)

如果换成递归函数,其实也不难,但是你真的能理解这个递归函数的运行流程吗?

def fib(n):    if n==1 or n==2 :        return 1    return fib(n-1)+fib(n-2)

首先得知道,递归函数是先调用后执行。以上述fib()函数为例,求第5项斐波拉契数列,来看看递归函数的执行过程。

图1 函数调用过程

fib()函数会沿着红色箭头一直调用到能够执行到递归出口的函数,也就是当n等于1或者2时,此时并没有执行任何数值计算,只是在不停的调用子函数。当执行到递归出口时,才得到第一项和第二项斐波拉契的值,并向上返回。

图二中蓝色箭头表示函数的调用过程,红色箭头表示递归函数在递归出口得到值后,不断的往上一层递归函数返回值。


图2 代码执行流程

n=5会执行fib(4)fib(3)…,而当n=1或者2时,会执行fib()函数中if下的语句,也就是递归出口,return 1,当函数执行return语句时表明函数执行结束,返回结果1

但在这个递归函数中,执行fib(5)会得到1吗?很明显不会,那这个1去哪了,不应该直接返回,然后结束函数吗?

很明显这个1并不是fib(5)的递归出口,这个1被返回给了上一层函数。以fib(3)为例:

n=3时,执行return fib(2)+fib(1)fib(2)fib(1)会直接返回1,返回的1便到了这里。变为了 return 1+1 fib(3)则会继续将2返回给fib(4)fib(4)接收到fib(3)fib(2)返回的21得到3,并返回给fib(5)


3 问题分析

这也解释了为什么很多人在使用递归函数时,return的值为None,但在returnprint却有值的问题。因为你只在函数最后一层return,这个return只会将值返回给函数上一层。如果需要将值返回调用,那么每一层函数都得有return并且被执行。


4 结论

递归函数在编程中是很实用和常见的工具,明白了递归函数的执行过程,对于算法的学习有很大的好处。下一篇文章来看看怎么使用递归函数并结合DFS算法实现全排列吧。


目录
相关文章
|
1月前
|
JavaScript 前端开发 开发者
Vue执行流程及渲染解析
【10月更文挑战第2天】
107 58
|
25天前
|
前端开发 JavaScript 开发者
揭秘前端高手的秘密武器:深度解析递归组件与动态组件的奥妙,让你代码效率翻倍!
【10月更文挑战第23天】在Web开发中,组件化已成为主流。本文深入探讨了递归组件与动态组件的概念、应用及实现方式。递归组件通过在组件内部调用自身,适用于处理层级结构数据,如菜单和树形控件。动态组件则根据数据变化动态切换组件显示,适用于不同业务逻辑下的组件展示。通过示例,展示了这两种组件的实现方法及其在实际开发中的应用价值。
33 1
|
1月前
|
JavaScript 前端开发 UED
Vue执行流程及渲染解析
【10月更文挑战第5天】
|
1月前
|
存储 搜索推荐 数据库
运用LangChain赋能企业规章制度制定:深入解析Retrieval-Augmented Generation(RAG)技术如何革新内部管理文件起草流程,实现高效合规与个性化定制的完美结合——实战指南与代码示例全面呈现
【10月更文挑战第3天】构建公司规章制度时,需融合业务实际与管理理论,制定合规且促发展的规则体系。尤其在数字化转型背景下,利用LangChain框架中的RAG技术,可提升规章制定效率与质量。通过Chroma向量数据库存储规章制度文本,并使用OpenAI Embeddings处理文本向量化,将现有文档转换后插入数据库。基于此,构建RAG生成器,根据输入问题检索信息并生成规章制度草案,加快更新速度并确保内容准确,灵活应对法律与业务变化,提高管理效率。此方法结合了先进的人工智能技术,展现了未来规章制度制定的新方向。
36 3
|
1月前
|
存储
atoi函数解析以及自定义类型经典练习题
atoi函数解析以及自定义类型经典练习题
39 0
|
1月前
|
存储 缓存 边缘计算
揭秘直播带货背后的黑科技:播放流程全解析!
大家好,我是小米,今天聊聊社区直播带货的技术细节。我们将探讨直播播放流程中的关键技术,包括 HTTP DASH 协议、POP(Point of Presence)缓存和一致性哈希算法等。通过这些技术,直播流能根据网络状况动态调整清晰度,保证流畅体验。POP 和 DC 的多层次缓存设计减少了延迟,提升了观看效果。无论是技术人员还是直播运营者,都能从中受益。希望通过本文,你能更好地理解直播背后的技术原理。
47 3
|
1月前
|
数据处理 Python
深入探索:Python中的并发编程新纪元——协程与异步函数解析
深入探索:Python中的并发编程新纪元——协程与异步函数解析
27 3
|
1月前
|
机器学习/深度学习 算法 C语言
【Python】Math--数学函数(详细附解析~)
【Python】Math--数学函数(详细附解析~)
|
1月前
|
程序员 C++
C++编程:While与For循环的流程控制全解析
总结而言,`while`循环和 `for`循环各有千秋,它们在C++编程中扮演着重要的角色。选择哪一种循环结构应根据具体的应用场景、循环逻辑的复杂性以及个人的编程风格偏好来决定。理解这些循环结构的内在机制和它们之间的差异,对于编写高效、易于维护的代码至关重要。
54 1
|
1月前
|
敏捷开发 数据可视化 测试技术
解析软件项目管理:以板栗看板为例,其如何有效影响并优化软件开发流程
软件项目管理是一个复杂而重要的过程,涵盖了软件产品的创建、维护和优化。其核心目标是确保软件项目能够顺利完成,同时满足预定的质量、时间和预算目标。本文将深入探讨软件项目管理的内涵及其对软件开发过程的影响,并介绍一些有效的管理工具。

推荐镜像

更多