递归函数在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))
程序内部逻辑执行流程图:
可以将注释打开,查看输出,配合流程图理解内部逻辑的执行过程