对于python中的函数递归,其实用while和for循环可以等价的实现。平时较少用到,但是在某些特定情况下比较方便实现一些功能。

对于没有数据分叉的函数递归,比较简单。如:

def cal(n):print(n)if n > 0:return cal(int(n/2))else:return 'n=0 done'print(cal(10))输出:
10
5
2
1
0
n=0 done

通过层层调用,达到条件后,结束调用,再层层返回。

但是对于有数据分叉的函数递归,如对嵌套列表的遍历、查询,就会比较绕一些

先看没有分叉的:

给定一个节点,在menus找到他,如果该节点存在,打印出来,并返回true,如果不存在,就返回false
menus = [    {        'text': '北京',        'children':[             {'text':'昌平','children':[                {'text':'沙河','children':[]}             ]}]}]
def find_menu(menu,city):    if menu:        for i in menu:            if i['text'] != city:               return find_menu(i['children'],city)  #如果本层没有city,则会深入到下一层            else:                print(city)                return True    else:        return False

city=input('>>>>')print(find_menu(menus,city))

可以看到比较容易就实现了。

但是这里menus有一个特点,就是每一级menus都只有一个元素,找过这个元素,本级就找完了。如果有多个元素呢?这就意味着,你把元素1里面嵌套的元素遍历一遍之后,还需要回头去找元素2但是如果把meuns改变一下,难度就会大大增加。
menus = [{'text': '北京','children':[{'text':'朝阳','children':[]},{'text':'昌平','children':[{'text':'沙河','children':[]},{'text':'回龙观','children':[]},]},]},{'text':'上海','children':[{'text':'宝山','children':[]},{'text':'金山','children':[]}]}
]

对于这个menus,如果我们继续用刚才的递归函数,就会达不到目的。

def find_menu(menu,city):if menu:for i in menu:if i['text'] != city:return find_menu(i['children'],city)  #如果本层没有city,则会深入到下一层else:print(city)return Trueelse:return False
city=input('>>>>')
print(find_menu(menus,city))>>>>朝阳
朝阳
True>>>>沙河
False>>>>宝山
False

可以看到,只有在找每级的第一个元素,即menus[0][0]...才可以,其余的全部都会返回False。这是因为,使用for循环,在每级都是从第一个元素开始找,找不到,就会递归至下一级的for循环,依然从下一级的第一个元素开始找起,直到最后一层,如何还是没有找到,就会return False,返回返回上一级。上一级继续执行retur语句,返回False,再返回上一级。以此类推,直到完全退出。这里我们发现,for循环根本就没有执行完,就直接退出了程序,达不到遍历的效果。

如果想将for循环进行完,就不能在find_menu(menus,city)前使用return,就不能将返回值一层一层向上传递,同样是不行的。

换个角度思考,什么时候可以结束for循环呢,就是找到 city情况下。如果找不到city,我们就需要让for循环一直执行下去,直到执行完,还是找不到的话,就说明没有city,这时可以返回false。

这么我们可以加一个条件语句,

if 找到了city

  就return

那么可以把代码改一下:

def find_menu(city,menu):if menu:for i in menu:if i['text'] != city:flag=find_menu(city,i['children'])if flag==True:return Trueelse:print(city)return Trueelse:return Falseelse:return False        

可以以最后find_menu的执行结果来判断,如果找到了city,find_menu就会返回True。如何把这个值一层一层传上去呢。我们可以让一个参数来接收返回值,并逐级上传。

也可以去掉这个参数,直接用find_menu的值。

由于menu为空的话, 肯定是没有找到city,for循环肯定也是执行完了,所以与最外层if对应的else也可以去掉。因为for--else已经返回了false。

def find_menu(city,menu):if menu:for i in menu:if i['text'] != city:if find_menu(city,i['children']):return Trueelse:print(city)return Trueelse:return False

这样就完成了一个有数据分叉的函数递归问题。

总结一下,使用函数递归,要紧盯使函数递归结束的条件,在此条件下,使用return。如果不满足此条件,函数将递归下去。如果最终还是不满足,可以再设置一个返回值。

写的内容有些乱,希望以后自己回顾时还能够看懂。

转载于:https://www.cnblogs.com/ohahastudy/p/8109675.html

python初学 数据分叉情况下的函数递归相关推荐

  1. 孤荷凌寒自学python第四十五天Python初学基础基本结束的下阶段预安装准备

    孤荷凌寒自学python第四十五天Python初学基础基本结束的下阶段预安装准备 (完整学习过程屏幕记录视频地址在文末,手写笔记在文末) 今天本来应当继续学习Python的数据库操作,但根据过去我自学 ...

  2. Mysql删除数据什么情况下会释放空间

    Mysql删除数据什么情况下会释放空间 删除数据几种情况以及是否释放磁盘空间 1.drop table table_name 立刻释放磁盘空间 ,不管是 Innodb和MyISAM 2.truncat ...

  3. oracle自动恢复数据库文件,只有数据文件情况下恢复Oracle数据库

    只有数据文件情况下恢复数据库 1,创建几个表,进行 log switch SQL> create table t9 as select * from dba_tables; Table crea ...

  4. ios 弱网 数据丢失_在不丢失数据的情况下将您的iOS设备与新计算机同步

    ios 弱网 数据丢失 Syncing your existing iOS device with a new computer can be a daunting task, especially ...

  5. 如何在不丢失游戏数据的情况下重置Nintendo Switch

    If your Nintendo Switch is having a serious problem-or you just want to wipe it before you sell it t ...

  6. 在不丢失数据的情况下解锁锁定的 Android 手机的 4 种方法

    尽管您可以使用指纹解锁手机,但大多数智能手机都需要 PIN 码.图案或字母数字代码作为主密码.如果您有一段时间没有输入手机密码,很容易忘记.正是由于这个原因,即使您打开了指纹解锁,大多数智能手机也会让 ...

  7. 在python中数据的输出用哪个函数名_在Python中,数据的输出用哪个函数名

    在Python中,数据的输出用哪个函数名 工业机器人按照坐标形式可以分为().A:圆柱坐标机器人B:球坐标机器人C:直角坐标机器人D:关节坐标机器人 生物膜上脂质主要是磷脂.A:对B:错 再结晶退火主 ...

  8. Java 7:在不丢失数据的情况下关闭NIO.2文件通道

    关闭异步文件通道可能非常困难. 如果您将I / O任务提交到异步通道,则需要确保正确执行了任务. 实际上,出于多种原因,这对于异步通道可能是一个棘手的要求. 默认的通道组使用守护进程线程作为工作线程, ...

  9. hbase Normalizer解决预分区错误,在不动数据的情况下完美解决热点问题

    (转)  http://www.aboutyun.com/forum.php?mod=viewthread&tid=24292 1.对于预分区错误,hbase使用什么功能解决? 2.Regio ...

最新文章

  1. 程序员在囧途之软件投标实战
  2. ICCV 2019 开源论文 | 基于元学习和AutoML的模型压缩新方法
  3. 5233杨光--Linux第一次实验
  4. ctrl f显示查找计算机,请教:快捷方式查找Ctrl+F失效,怎么办 – 手机爱问
  5. python中用于输出内容到终端的函数是_python执行linux shell管道输出内容
  6. think-cli脚手架快速搭建单模块VS多模块项目示例
  7. python做考勤表_考勤表下载免费后怎么制作?
  8. 《操作系统》信号量机制
  9. 数据分析师,如何向亲友解释自己的工作
  10. 最唯美的10首中国情诗
  11. 日本超人气洛比(Robi)声控机器人
  12. 原生JS使用input上传图片
  13. Pinta--一个画图软件
  14. win10edge启用html5,Win 10 Edge浏览器极速运行的设置方法
  15. Codeforces - Vowels
  16. 怎样恢复win10分区误删的数据
  17. 使用Guardium和WebSphere Application Server监视应用程序用户的数据库活动
  18. PHP:“草根语言”挑战“大腕”Java .Net
  19. classin安卓手机安装条件_ClassIn下载2020安卓最新版_手机app官方版免费安装下载_历趣...
  20. 计算机系统结构——流水线的分类

热门文章

  1. Java成神之路——UML类关系图
  2. 计算机资格考试中级工程师种类,中级工程师职称考试类别及注意事项
  3. pdf裁边app_哪款手机PDF阅读APP值得推荐?
  4. git怎么操作会丢失自己的代码_git找回丢失的代码
  5. 【Flink】Flink checkpoint 本地磁盘 没有清除
  6. 【算法】赫夫曼编码 解码
  7. 03-NIO通讯模型
  8. 95-35-010-Topic-Topic 删除 源码解析
  9. 【Flink】Generic types have been disabled in the ExecutionConfig and type KryoSerializer Row
  10. 【Elasticsearch】实用BM25 -第1部分: shard 如何影响Elasticsearch中的相关性评分