Python-深入理解递归函数中的return返回值

递归函数在Python实现决策树算法中出现过,这里记录下关于递归函数return的理解,以及递归函数的执行流程

假如有一个列表[4, [3, [2, [1]]]],现在要你计算这个列表里所有数字的和,该怎么实现呢?

先遍历最外面的列表,如果是数字,就累加,如果是列表,就继续遍历这个列表,这个列表里面的元素是数字,就累加,如果是列表,则继续遍历…遍历完最后一个数字后,将层层递归函数的累加值,原路返回,层层return出去,期间每层递归函数return的累加值需要和上一层递归函数的累加值相加,最终,函数终止时return的累加值就是我们需要的所有列表内数字之和了,下面是示意图:

下面是代码的实现,代码比较简单,就是程序内部逻辑的执行流程比较难懂,需要知道的是递归函数的return不是返回一个值然后程序结束,而是返回一个值到上一层的递归函数,直到return到最外层,也就是第一次执行的递归函数时,程序终止,为了验证这个逻辑,可以将下面代码中的注释打开,然后运行,会发现依次打印出了1,3,6,10,这个结果和上面的图示流程吻合

data = [4, [3, [2, [1]]]]

def sum_list_num(data):
    list_num = 0
    for i in data:
        if isinstance(i, list):
            list_num += sum_list_num(i)
        else:
            list_num += i
    # print(list_num)
    return list_num

if __name__ == '__main__':
    print(sum_list_num(data))

下面看个复杂的,用递归的方法算出决策树的层数,决策树如下图所示:在这里插入图片描述
算法逻辑:

1.从第一个判断节点开始,最大层数置为0,遍历该判断节点下的所有子节点;

2.如果子节点是叶子节点,那么,当前层数记为1,最大层数和当前层数中,较大的值置为最大层数,然后遍历下一个子节点;

3.如果子节点为判断节点,那么,重复1的操作;

4.如果当前遍历的是叶子节点,且是最后一个,那么,递归结束,将值层层return回上层函数,直至最开始的递归函数层,程序终止

代码如下

data = {'no surfacing': {0: 'no', 1: {'flippers': {0: {'head': {0: 'no', 1: {'fin': {0: 'no', 1: 'yes'}}}}, 1: {'warm blooded': {0: {'gill': {0: 'no', 1: {'jaw': {0: 'no', 1: 'yes'}}}}, 1: 'no'}}}}}}

def get_tree_depth(my_tree):
    max_depth = 0
    my_tree = list(my_tree.values())[0]
    for value in my_tree.values():
        this_depth = 1
        if isinstance(value, dict):  # 字典,即节点,需要进行一次递归
            r_max_depth = get_tree_depth(value)
            # print(r_max_depth, this_depth)
            this_depth += r_max_depth
        # print(this_depth, max_depth)
        max_depth = max(this_depth, max_depth)
    # print(max_depth)
    return max_depth

if __name__ == '__main__':
	print(get_tree_depth(my_tree))

程序内部逻辑执行流程图:
在这里插入图片描述
可以将注释打开,查看输出,配合流程图理解内部逻辑的执行过程

  • 9
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值