python递归函数的执行过程
举例:
def nove(n,a,b,c):
if n == 1:
print(a,'------------>',c)
else:
nove(n-1,a,c,b)
nove(1,a,b,c)
nove(n-1,b,a,c)
执行输出结果:
nove(3, 'A', 'B', 'C')
# A --> C
# A --> B
# C --> B
# A --> C
# B --> A
# B --> C
# A --> C
执行过程详解:
1 def nove(n, a='A', b='B', c='C'):
2 if n == 1:
3 return print(a, "->", c)
4 else:
5 nove((n-1), a, c, b)
6 print(a, "->", c)
7 nove((n-1), b, a, c)
8
9 nove(3)
第6行print(a, "->", c)可以写做nove(1, a, b, c),个人感觉可以不用这么写,print(a, "->", c)这样可以让代码少跑两步。
开始运行nove( 3 ):
nove 函数代入 ‘ 行9’ ( n = 3 )参数 (3, a='A', b='B', c='C')
第一步 执行 ‘行2 - 3’ if n == 1:......:
n != 1 , ‘行2 - 3’越过
第二步 执行 ‘行4’else::
执行 ‘行5’, 第一次递归开始,((n-1), a, c, b)回到函数最初代入(3, a='A', b='B', c='C'),得出参数为(2, 'A', 'C', 'B'),【!注意: 此时‘行1 ’(3, a='A', b='B', c='C')在 ‘行5’ 递归回到函数最初运行后已改变为(2, a='A', b='C', c='B')】
执行 ‘行2 - 3’ ,n != 1 , ‘行2 - 3’ 越过
- 执行
else:- 执行 ‘行5’,将
((n-1), a, c, b)代入(2, a='A', b='C', c='B'),得出参数为(1, 'A', 'B', 'C'),继续执行 ‘行2 - 3’,n == 1返回输出:(a, "->", c)代入(1, 'A', 'B', 'C'),即A -> C - 回到 ’ 行5‘,继续执行 ‘行6’ ,将
(a, "->", c)代入nove函数(2, a='A', b='C', c='B')并输出,即A -> B - 执行 ’行7‘,将
( (n-1), b, a, c)代入(2, a='A', b='C', c='B')得出参数为(1, 'C', 'A', 'B'),继续执行 ‘行2 - 3’,n == 1返回输出:(a, "->", c)代入(1, 'C', 'A', 'B'),即C -> B
- 执行 ‘行5’,将
- 执行
第三步 执行 ‘行6’
print(a, "->", c):(a, "->", c)代入nove函数(3, a='A', b='B', c='C')并输出,即A -> C第四步 执行 ’行7‘
nove((n-1), b, a, c):- 执行 ‘ 行7’ ,第二次递归开始,
((n-1), b, a, c)代入(3, a='A', b='B', c='C')得出参数为(2, 'B', 'A', 'C')【!注意: 此时 ‘行1 ’(3, a='A', b='B', c='C')在 ‘行7’ 递归回到函数最初运行后已改变为(2, a='B', b='A', c='C')】- 执行 ‘行2 - 3’ ,
n != 1, ‘行2 - 3’ 越过- 执行
else:- 执行 ‘行5’,将
((n-1), a, c, b)代入(2, a='B', b='A', c='C')得出参数为(1, 'B', 'C', 'A'),继续执行‘行2 - 3’,n == 1返回输出:(a, "->", c)代入(1, 'B', 'C', 'A'),即B -> A - 回到 ’ 行5‘,继续执行 ‘行6’ ,将
(a, "->", c)代入nove函数(2, a='B', b='A', c='C')并输出,即B -> C - 执行 ’行7‘,将
((n-1), b, a, c)代入(2, a='B', b='A', c='C')得出参数为(1, 'A', 'B', 'C'),继续执行 ‘行2 - 3’,n == 1返回输出:(a, "->", c)代入(1, 'A', 'B', 'C'),即A -> C 代码运行结束,输出结果为:
A -> C
A -> B
C -> B
A -> C
B -> A
B -> C
A -> C
- 执行 ‘行5’,将
- 执行
- 执行 ‘行2 - 3’ ,
python递归函数的执行过程的更多相关文章
- Python程序的执行过程原理(解释型语言和编译型语言)
Python是一门解释型语言?我初学Python时,听到的关于Python的第一句话就是Python是一门解释型语言,我就这样一直相信下去,直到发现.pyc文件的存在,如果真是解释型语言,那么生成的. ...
- Python程序的执行过程 解释型语言和编译型语言
转载地址:http://blog.csdn.net/lujiandong1/article/details/50067655 1. Python是一门解释型语言? 我初学Python时,听到的关于Py ...
- 说说Python程序的执行过程
1. Python是一门解释型语言? 我初学Python时,听到的关于Python的第一句话就是,Python是一门解释性语言,我就这样一直相信下去,直到发现了*.pyc文件的存在.如果是解释型语言, ...
- python函数的执行过程
对于 Python 常规函数,都只有一个入口,但会有多个出口如 return 返回或者抛出异常.函数从入口进入会一直运行到 return 语句或者抛出异常,中间不会暂停,函数一直拥有控制权.当运行结束 ...
- Python程序的执行过程
1. Python是一门解释型语言? 我初学Python时,听到的关于Python的第一句话就是,Python是一门解释性语言,我就这样一直相信下去,直到发现了*.pyc文件的存在.如果是解释型语言, ...
- 从底层简析Python程序的执行过程
摘要:是否想在Python解释器的内部晃悠一圈?是不是想实现一个Python代码执行的追踪器?没有基础?不要怕,这篇文章让你初窥Python底层的奥妙. [编者按]下面博文将带你创建一个字节码级别的追 ...
- 【原创】控制perl和python脚本执行过程中脚本文件是否关闭的方法
引子 跟踪perl和python脚本对文件的访问,实际过程中,perl和python解析器在解析完脚本后,直接关闭了 脚本文件,在进程中查询不到是访问文件的脚本文件名称. shell.perl和pyt ...
- .pyc是个什么 python的执行过程
1. Python是一门解释型语言? 我初学Python时,听到的关于Python的第一句话就是,Python是一门解释性语言,我就这样一直相信下去,直到发现了*.pyc文件的存在.如果是解释型语言, ...
- Python内部执行过程
一.编译过程概述 当我们执行Python代码的时候,在Python解释器用四个过程“拆解”我们的代码,最终被CPU执行返回给用户. 首先当用户键入代码交给Python处理的时候会先进行词法分析,例如用 ...
随机推荐
- Flask常用路由参数
Flask中的路由参数: @app.route(‘/’, endpoint=’xx’ , methods=[‘GET’,...]) >endpoint后的名字,用来反向生成url的.后面的名字随 ...
- 关联分析-MIC
MIC:the Maximal Information Coefficient,是用网格分法判断数据的集中程度的一个标准. MIC所依据的理念是,如果2个变量之间存在着一种关系,那么就应该有一种方法在 ...
- c语言之函数指针应用
c语言之函数指针应用 1.函数指针与指针函数 在开始运用函数指针前,我们需要将两个概念即:函数指针与指针函数搞清楚. 函数指针,指明这个一个函数,但返回值为指针类型,语法格式为: 类型名* 函数名A( ...
- malloc vs memset
malloc vs memset OS内存分配过程如下: 用户态程序使用malloc接口,分配虚拟地址. 用户程序访问该虚拟地址,比如memset. 硬件(MMU)需要将虚拟地址转换为物理地址. 硬件 ...
- python 散点图上给每个点打标签方便看到数据
import numpy as np import matplotlib.pyplot as plt x=[2.3,4.5,3,7,6.5,4,5.3] y=[5,4,7,5,5.3,5.5,6.2] ...
- Alpha冲刺——总结篇
课程信息 课程 软件工程1916|W(福州大学) 团队名称 修!咻咻! 作业要求 项目Alpha冲刺 团队目标 切实可行的计算机协会维修预约平台 团队信息 队员学号 队员姓名 个人博客地址 备注 22 ...
- JOI徽章
[题目描述] 日本信息学奥赛委员会为了应援将要去台湾参加 IOI 的选手们,打算制作一面新的 JOI 旗帜 .JOI 旗帜为由 M 行 N 列的 M*N 个正方形组 成的图形,每个正方形里写有 J,O ...
- linux shell 写swoole重启脚本
linux shell 写swoole重启脚本 代码如下<pre>#!/bin/shkill `lsof -t -i:9501`sleep 2php /data/web/mircoweb/ ...
- 一文让你彻底理解准确率,精准率,召回率,真正率,假正率,ROC/AUC
参考资料:https://zhuanlan.zhihu.com/p/46714763 ROC/AUC作为机器学习的评估指标非常重要,也是面试中经常出现的问题(80%都会问到).其实,理解它并不是非常难 ...
- 线程互斥synchronized
/** * * 线程互斥,采用synchronized关键字可以实现线程与线程之间的互斥,要注意的是在synchronized上的对象要是同一个,才可以 * 保证在同一时刻,只有一个线程可以执行syn ...