递归函数中没有return

您所在的位置:网站首页 递归函数一定要有返回值吗 递归函数中没有return

递归函数中没有return

2022-09-05 22:03| 来源: 网络整理| 查看: 265

递归函数在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))

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



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3