楼外青楼

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

一. 基础概念


 

 

    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)

 

posted on 2019-05-17 16:23  楼外青楼  阅读(261)  评论(0编辑  收藏  举报