zoukankan      html  css  js  c++  java
  • 递归函数(初级难点)

    一. 基础概念


     

     

        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)
  • 相关阅读:
    js中的this指针(五)
    一个链式调用 setTimeout的例子
    js中的this指针(四)
    js中的this指针(三)
    NOJ 爱过
    Greatest Greatest Common Divisor HD5207
    Greatest Greatest Common Divisor HD5207
    Greatest Greatest Common Divisor HD5207
    Greatest Greatest Common Divisor HD5207
    Four Inages Strateg
  • 原文地址:https://www.cnblogs.com/scy645670291/p/10881989.html
Copyright © 2011-2022 走看看