递归函数的概念:

直接或间接的调用自身的函数,称为递归函数。

每调用一次自身,相当于复制一份该函数,只不过参数有变化,参数的变化,就是重要的结束条件

下面是一个递归函数的实例:

#coding=utf-8
def calc(n): print(n) if int(n/2) > 0:
calc(int(n/2))
else:
print('------') print(n)
calc(10)

打印结果:

10
5
2
1
------
1
2
5
10

第一次接触递归函数的人,都会被它调用本身而搞得晕头转向,而且看上面的函数调用,以为得到的结果会是:

10
5
2
1
------
1

为什么以为会得出上面的结果呢?因为都把调用函数本身之后的代码给忘记了,就是else之后的python 代码。

实际此递归函数输出的是以下结果:

10
5
2
1
------
1
2
5
10

相信大家看到这里都有点蒙,我也一样,我第一次看到这个递归函数时,只能理解到第一个结果。那是因为,大部分人在做事情的时候,中断第一件事,被安排去做第二件事的时候,就会把第一件事后续的事情给忘记,如果在做第二件事的时候,又被中断,被安排去做第三件事,就会把第一件、第二件要做的后续的事情给忘记......,这就是不理解递归函数的原因。

下面我把此递归函数做了一个分解,希望能够帮到大家。

详解递归函数,当调用递归函数calc(10)时,执行过程如下:

#coding=utf-8
def calc(10):
print(10)
if int(10/2) > 0: def calc(5):
print(5)
if int(5/2) > 0: def calc(2):
print(2)
if int(2/2) > 0: def calc(1):
print(1)
print('------')
print(1)
print(2)
print(5)
print(10)

在调用函数本身时,它之后的代码并没有结束,而是在等待条件为False 时,再接着执行之后的代码,同一个颜色的print()语句等待对应颜色的函数。

如果看到这里还不理解,那请看下面过程

#coding=utf-8
def calc(10): print(10) if int(10/2) > 0:
calc(int(10/2))
else:
print('------') print(10) |
|
v
def calc(5): print(5) if int(5/2) > 0:
calc(int(5/2))
else:
print('------') print(5) |
|
v
def calc(2): print(2) if int(2/2) > 0:
calc(int(2/2))
else:
print('------') print(2) |
|
v
def calc(1): print(1) if int(1/2) > 0: #此时条件不成立,走else
calc(int(1/2))
else:
print('------') print(1)

可以看到,每次条件成立都会调用函数本身,那函数本身最后是有一个print的,所以才会出现对称的那种结果。

Python 递归函数详解的更多相关文章

  1. Python 递归函数 详解

    Python 递归函数 详解   在函数内调用当前函数本身的函数就是递归函数   下面是一个递归函数的实例: 第一次接触递归函数的人,都会被它调用本身而搞得晕头转向,而且看上面的函数调用,得到的结果会 ...

  2. Python闭包详解

    Python闭包详解 1 快速预览 以下是一段简单的闭包代码示例: def foo(): m=3 n=5 def bar(): a=4 return m+n+a return bar >> ...

  3. [转] Python Traceback详解

    追莫名其妙的bugs利器-mark- 转自:https://www.jianshu.com/p/a8cb5375171a   Python Traceback详解   刚接触Python的时候,简单的 ...

  4. python 数据类型详解

    python数据类型详解 参考网址:http://www.cnblogs.com/linjiqin/p/3608541.html 目录1.字符串2.布尔类型3.整数4.浮点数5.数字6.列表7.元组8 ...

  5. python线程详解

    #线程状态 #线程同步(锁)#多线程的优势在于可以同时运行多个任务,至少感觉起来是这样,但是当线程需要共享数据时,可能存在数据不同步的问题. #threading模块#常用方法:'''threadin ...

  6. python数据类型详解(全面)

    python数据类型详解 目录1.字符串2.布尔类型3.整数4.浮点数5.数字6.列表7.元组8.字典9.日期 1.字符串1.1.如何在Python中使用字符串a.使用单引号(')用单引号括起来表示字 ...

  7. Python Collections详解

    Python Collections详解 collections模块在内置数据结构(list.tuple.dict.set)的基础上,提供了几个额外的数据结构:ChainMap.Counter.deq ...

  8. python生成器详解

    1. 生成器 利用迭代器(迭代器详解python迭代器详解),我们可以在每次迭代获取数据(通过next()方法)时按照特定的规律进行生成.但是我们在实现一个迭代器时,关于当前迭代到的状态需要我们自己记 ...

  9. 转 python数据类型详解

    python数据类型详解 目录 1.字符串 2.布尔类型 3.整数 4.浮点数 5.数字 6.列表 7.元组 8.字典 9.日期 1.字符串 1.1.如何在Python中使用字符串 a.使用单引号(' ...

随机推荐

  1. 「Spring Boot 2.4 新特性」一键构建Docker镜像

    背景 在我们开发过程中为了支持 Docker 容器化,一般使用 Maven 编译打包然后生成镜像,能够大大提供上线效率,同时能够快速动态扩容,快速回滚,着实很方便.docker-maven-plugi ...

  2. Spring 学习笔记(三):Spring Bean

    1 Bean配置 Spring可以看做是一个管理Bean的工厂,开发者需要将Bean配置在XML或者Properties配置文件中.实际开发中常使用XML的格式,其中<bean>中的属性或 ...

  3. Go-30-main包

    main包 package main import ( "fmt" "kubeflow-tool/main/cmd" "os" ) func ...

  4. Word 查找和替换字符串方法

    因为项目需要通过word模板替换字符串 ,来让用户下载word, 就在网上找了找word查找替换字符串的库或方法,基本上不是收费,就是无实现,或者方法局限性太大 .docx 是通过xml来存储文字和其 ...

  5. 使用yamllint 检查yaml语法

    安装node 之后npm install -g yaml-lint 使用方法 yamllint confluence.yaml

  6. ES系列(三):网络通信模块解析

    ES是一个分布式搜索引擎,其除了用户提供必要的通信服务外,集群间也必须保持紧密的通信联系,才能在必要的时候给出正确的结果.其则必然涉及到各种繁多且要求高的通信场景,那么如何实现高性能的通信,则是其必须 ...

  7. git 避免重复输入用户名密码问题解决

    "store" 模式会将凭证用明文的形式存放在磁盘中,并且永不过期. 这意味着除非你修改了你在 Git 服务器上的密码,否则你永远不需要再次输入你的凭证信息. 这种方式的缺点是你的 ...

  8. yapi简介,安装及使用

    简介 ​ YApi 是高效.易用.功能强大的 api 管理平台,旨在为开发.产品.测试人员提供更优雅的接口管理服务.可以帮助开发者轻松创建.发布.维护 API,YApi 还为用户提供了优秀的交互体验, ...

  9. 获取全局描述符表GDT的内容

    /stdfx.h文件 //Ring0环的程序 //测试环境VS2005 #ifndef _WIN32_WINNT // Allow use of features specific to Window ...

  10. 从苏宁电器到卡巴斯基第13篇:我在苏宁电器当营业员 V

    强大的竞争对手 与现在遍地开花的苹果店相比,在2010年左右的时候,在长春,真正得到苹果授权的苹果店还是屈指可数的.当时在重庆路上如果想买苹果的产品,要么可以去苏宁国美,要么只能去卓展楼上的苹果专区了 ...