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]#