一. 基础概念
1. 定义: 在函数内部调用自己
2. 特点: 递归函数必须要有递归结束的条件,否则会出现无限递归,程序奔溃
3. 获取默认递归次数: sys.getresursionlimit()
4. 修改默认递归次数: sys.setrecursionlimit()
5. 一般写递归的方式:
a. 写出临界条件
b. 找出这一次与上一次的关系
c. 假设当前函数已能用,调用自身计算上一次的结果,再求出本次的结果
二. 递归逻辑
递归可以分为: 递 和 归 两部分
def digui(n): print(n) if n > 0: digui(n - 1) else: print('------') print(n) digui(3)
具体实现逻辑:
三. 应用案例
1. 求n的阶乘
def calc_num(n): if n == 1: return 1 else: return n * calc_num(n-1) result = calc_num(4) print(result)
2. 二分查找算法(查找50在列表中的索引,从0开始数)
不使用index函数,使用递归函数利用二分法求出某个值在容器中的位置(注意: 使用二分法时数据必须是递增或递减的)
# 获取到一个含有50的列表 import random my_list = [] for i in range(10): num = random.randint(0, 100) my_list.append(num) my_list.append(50) list1 = list(set(my_list)) list1.sort() print(list1) # 定义函数,实现功能 def find_index(my_list, targer, start=0, end=None): # 第一次开始end等于列表长度,后续end等于传过来的值 end = len(my_list) if end is None else end # 找到列表的中间索引 mid_index = (end - start) // 2 + start # 设置递归开始与结束条件 if start <= end: # 如果中间值大于目标值 if my_list[mid_index] > targer: # 继续调用自身将结果返回给上一次,开始索引不变,结束索引设置为中间值索引减1 return find_index(my_list, targer, start=start, end=mid_index - 1) # 如果中间值小于目标值 elif my_list[mid_index] < targer: # 继续调用自身将结果返回给上一次,结束索引不变,开始索引设置为中间值索引加1 return find_index(my_list, targer, start=mid_index + 1, end=end) # 如果相等,返回找到了 else: return f'{targer}的下标是{mid_index}' else: return f'未在{my_list}中找到{targer}' result = find_index(list1, 50) print(result)
3. 求第n个斐波拉契数的值
# 求第N个斐波拉契数 def fib(n): if n == 1 or n == 2: return 1 else: return fib(n - 1) + fib(n - 2) result = fib(20) print(result)