递归函数接收不到返回值问题


在研究二分法问题时,碰巧遇到一个特别有意思的事情,自己之前没有发现,在二分法最终列表为空的时候,想要return 终止函数,但是发现却接收不到返回值(这里其实不重要,我原本也不想要返回值),但是发现了这个问题就忍不了了,源代码如下:

# 二分法能够使用的场景:数据集必须有序.
l1 = [13,9,12,23,35,42,56,64,77,89,94,108,112,120,139,147,158,169,173]

# 要求:在列表中找出目标数字
# 二分法的思维,将数据集一分为二,不断重复,直到找到目标。

def find_num(target_num, lis):
	# 还要想到一种情况:目标数字不在列表当中
	if len(lis) == 0:  # 列表找空了,没找到
		print('没有找到target_num:{}'.format(target_num))
		return 1
	# 先获取中间位置的索引值
	mid_index = len(lis)//2
	# 判断目标数字与中间位置索引对应的数字大小关系
	if target_num > lis[mid_index]:
		# 说明目标数字在列表中间索引右侧
		lis_r = lis[mid_index + 1: ]   # 切片取值
		# 继续调用该函数
		find_num(target_num,lis_r)
	elif target_num < lis[mid_index]:
		# 说明目标数字在列表中间索引左侧
		lis_l = lis[: mid_index]  # 切片取值
		# 继续调用该函数
		find_num(target_num,lis_l)
	else:
		# 中间索引值对应数字恰好是目标数字
		print('找到了target_num:{}'.format(target_num))


find_num(42, l1)
# 找到了target_num:42
print(find_num(111, l1))
# 没有找到target_num:111  None

经过测试,在else语句后面也加了return,发现如果只执行一次函数,那么可以得到返回值,一旦开始了递归就接收不到返回值了,

后来发现,在函数开始递归之后,调用的函数的返回值没有被接收,也没有设置返回值。

最终修改代码后,问题解决,代码如下图

相关