Python递归_打印节点信息

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

二、需求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]# 
View Code

 

转载于:https://www.cnblogs.com/bjx2020/p/8686636.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值