Python递归_打印节点信息

递归特性:
1、必须由一个明确的结束条件
2、每次进入更深一层递归时,问题规模相比上一次递归都应该有所减少
3、递归效率不高,递归层次过多会导致栈溢出(在计算机中,函数调用时通过栈(stack)
   这种数据结构实现的,每当进入一个函数调用,栈就会加一层栈帧,每当函数返回,
   栈就会减一层栈帧。由于栈的大小不是无限的,所以,递归调用的次数过多,会导致
   栈溢出)

一、需求1:打印所有的节点

[root@db01 test]# cat duigui1.py
#!/usr/bin/env python3
# -*- coding:utf-8 -*-
# Author: davie
"""
递归特性:
1、必须由一个明确的结束条件
2、每次进入更深一层递归时,问题规模相比上一次递归都应该有所减少
3、递归效率不高,递归层次过多会导致栈溢出(在计算机中,函数调用时通过栈(stack)
这种数据结构实现的,每当进入一个函数调用,栈就会加一层栈帧,每当函数返回,
栈就会减一层栈帧。由于栈的大小不是无限的,所以,递归调用的次数过多,会导致
栈溢出)
"""
# 递归练习题
menus = [
{
'text':'北京',
'children':[
{'text':'朝阳','children':[]},
{'text':'昌平','children':[
{'text':'沙河','children':[]},
{'text':'回龙观','children':[]}
]}
]
},
{
'text':'上海',
'children':[
{'text':'宝山','children':[]},
{'text':'金山','children':[]}
]
}
] # 1、打印所有的节点
# 2、输入一个节点名字,你要遍历找,找到了,就打印它,并返回true。 def print_nodes(menus):
for sub_menu in menus:
menu_parent_text = sub_menu['text']
menu_children = sub_menu['children']
if menu_parent_text:
print(menu_parent_text)
print('\t',menu_children)
print_nodes(menus)
[root@db01 test]# # 执行结果 [root@db01 test]# python3 duigui1.py
北京
[{'text': '朝阳', 'children': []}, {'text': '昌平', 'children': [{'text': '沙河', 'children': []}, {'text': '回龙观', 'children': []}]}]
上海
[{'text': '宝山', 'children': []}, {'text': '金山', 'children': []}]
[root@db01 test]#

二、需求2:打印所有的节点,输入一个节点名字,你要遍历找,找到了,就打印它,并返回true

[root@db01 test]# cat duigui2.py
#!/usr/bin/env python3
# -*- coding:utf-8 -*-
# Author: davie
"""
递归特性:
1、必须由一个明确的结束条件
2、每次进入更深一层递归时,问题规模相比上一次递归都应该有所减少
3、递归效率不高,递归层次过多会导致栈溢出(在计算机中,函数调用时通过栈(stack)
这种数据结构实现的,每当进入一个函数调用,栈就会加一层栈帧,每当函数返回,
栈就会减一层栈帧。由于栈的大小不是无限的,所以,递归调用的次数过多,会导致
栈溢出)
"""
# 递归练习题
menus = [
{
'text':'北京',
'children':[
{'text':'朝阳','children':[]},
{'text':'昌平','children':[
{'text':'沙河','children':[]},
{'text':'回龙观','children':[]}
]}
]
},
{
'text':'上海',
'children':[
{'text':'宝山','children':[]},
{'text':'金山','children':[]}
]
}
] # 2、打印所有的节点,输入一个节点名字,你要遍历找,找到了,就打印它,并返回true。
def print_nodes(menus):
for sub_menu in menus:
menu_parent_text = sub_menu['text']
menu_children = sub_menu['children']
if menu_parent_text:
print(menu_parent_text)
print('\t',menu_children)
print_nodes(menus) def print_node(menu,node,layer):
for sub_menu in menu:
menu_parents_text = sub_menu["text"]
menu_children_node = sub_menu["children"]
#print("menu_parents_text = ",menu_parents_text)
if node == menu_parents_text:
print("找到%s在第%s层" %(node,layer)) # 返回到外层
return True
else:
if print_node(menu_children_node,node,layer+1) == True: # 如果里层返回True,继续向上返回True
return True
node_input = input("请输入一个节点的名字>:").strip()
print(print_node(menus,node_input,1)) [root@db01 test]# # 执行结果
[root@db01 test]# python3 duigui2.py
北京
[{'text': '朝阳', 'children': []}, {'text': '昌平', 'children': [{'text': '沙河', 'children': []}, {'text': '回龙观', 'children': []}]}]
上海
[{'text': '宝山', 'children': []}, {'text': '金山', 'children': []}]
请输入一个节点的名字>:海口
None
[root@db01 test]# python3 duigui2.py
北京
[{'text': '朝阳', 'children': []}, {'text': '昌平', 'children': [{'text': '沙河', 'children': []}, {'text': '回龙观', 'children': []}]}]
上海
[{'text': '宝山', 'children': []}, {'text': '金山', 'children': []}]
请输入一个节点的名字>:东城区
None
[root@db01 test]# python3 duigui2.py
北京
[{'text': '朝阳', 'children': []}, {'text': '昌平', 'children': [{'text': '沙河', 'children': []}, {'text': '回龙观', 'children': []}]}]
上海
[{'text': '宝山', 'children': []}, {'text': '金山', 'children': []}]
请输入一个节点的名字>:沙河
找到沙河在第3层
True
[root@db01 test]# python3 duigui2.py
北京
[{'text': '朝阳', 'children': []}, {'text': '昌平', 'children': [{'text': '沙河', 'children': []}, {'text': '回龙观', 'children': []}]}]
上海
[{'text': '宝山', 'children': []}, {'text': '金山', 'children': []}]
请输入一个节点的名字>:金山
找到金山在第2层
True
[root@db01 test]#

Python递归_打印节点信息的更多相关文章

  1. Python traceback 模块, 打印异常信息

    Python感觉是模仿Java, 到处都需要加try..catch.... 这里记录一下用法,方便后续使用. # -*- coding:utf-8 -*- import os import loggi ...

  2. [已解决] Python logging 重复打印日志信息

    问题描述 问题代码如下: def get_logger(logger_name): """得到日志对象""" logger = loggin ...

  3. php_公共方法01_传入数组_打印可见信息

    function decodeUnicode($str) { return preg_replace_callback('/\\\\u([0-9a-f]{4})/i', 'convert', $str ...

  4. php 数据集转换树、递归重组节点信息多维数组(转)

    一.将数据集转换成树 /** * 将返回的数据集转换成树 * @param array $list 数据集 * @param string $pk 主键 * @param string $pid 父节 ...

  5. [python]打印异常信息的不同方式

    异常捕获 try: execpt Exception as e: print(str(e)) 打印异常信息的方式 1.str(e) 返回字符串类型,只给出异常信息,不包括异常信息的类型,如1/0的异常 ...

  6. python使用进程池多进程时,如何打印错误信息

    一.说明 1.python进程池进行多进程运行时,如果有错误,该进程会直接跳过,并且不会打印错误信息. 2.如果需要了解到进程内的错误信息,此时就需要通过捕获异常来输出错误信息了. 二.具体方法如下: ...

  7. java 递归及其经典应用--求阶乘、打印文件信息、计算斐波那契数列

    什么是递归 我先看下百度百科的解释: 一种计算过程,如果其中每一步都要用到前一步或前几步的结果,称为递归的.用递归过程定义的函数,称为递归函数,例如连加.连乘及阶乘等.凡是递归的函数,都是可计算的,即 ...

  8. python学习(五)--打印错误信息

    from urllib import request #打印错误信息 except Exceptionlist = [ "http://www.baidu11.com/", &qu ...

  9. python学习_数据处理编程实例(二)

    在上一节python学习_数据处理编程实例(二)的基础上数据发生了变化,文件中除了学生的成绩外,新增了学生姓名和出生年月的信息,因此将要成变成:分别根据姓名输出每个学生的无重复的前三个最好成绩和出生年 ...

随机推荐

  1. java发送http的get、post请求

    转载博客:http://www.cnblogs.com/zhuawang/archive/2012/12/08/2809380.html Http请求类 package wzh.Http; impor ...

  2. sql server 中隐藏掉无关数据库

    先贴上我实际测试的效果 方法一: Problem I have a SQL Server instance that has hundreds of databases.  Navigating th ...

  3. cmake cannot find package

    cmake 找不到package,如 find_package (OpenMesh REQUIRED) 出现错误 在项目的文件夹中找到 FindOpenMesh.cmake 文件,将其所在路径添加到 ...

  4. 去掉移动端页面 input, textarea, button, a 标签获取焦点时显示的黑影

    input, textarea, button, a{ -webkit-tap-highlight-color:rgba(0,0,0,0); }

  5. SQL笔记 - CTE递归实例(续):显示指定部门的全称

    前一篇文章中已经可以取得所有部门的全称,但现在又有个新的需求: 只想得到某一个部门的部门全称,虽然可以用where条件来过滤,但是会有点小浪费. 这时我们可以从后往前找,先看下效果: 最后一条就是,行 ...

  6. D3.js 力导向图

    花了大半天看了一个八十几行的代码..心累 力导向图是之前就有画过很多次的东西,但是这次的代码看上去很陌生,然后发现是D3更新了4.0.... 先贴代码 var svg = d3.select(&quo ...

  7. 地图坐标转换 -- 火星坐标与GPS坐标

    第一次处理地理位置的数据的人,没什么经验,往往掉入很多坑浪费不少时间.我也是刚刚从坑里爬出来.这篇博文主要是把入门GPS轨迹分析的经验总结一下,以方便大家少走些弯路. (1)可视化 GPS 路径 刚拿 ...

  8. matlab 函数说明—conv2

    conv 是卷积的意思,2表示2维卷积.   conv2的调用形式如下: 1. C = conv2(A,B) 这是最简单的一种调用形式,B作为卷积核在A的范围内滑动,若[ma na] =size(A) ...

  9. poj2245

    题目分析: 抽奖 在德国乐透你需要从49个数(1,2,3......49)里面选择6个数,玩德国乐透一个流行的策略-尽管他不会增加你获奖的机会-选择一个子集S包含k(k>6)个数从这49个数字里 ...

  10. MVC Bootstrap极速开发框架

    ASP.NET MVC Bootstrap极速开发框架 前言 每次新开发项目都要从头开始设计?有木有一个通用的快速开发框架?并且得是ASP.NET MVC  And Bootstrap?数据库不要手工 ...