zoukankan      html  css  js  c++  java
  • Python-函数递归

    一、函数递归

    引入

    函数的递归调用:就是在调用一个函数的过程中又直接或间接地调用自己
    示例1:直接调用自己

    def foo():
        print('hello')
        foo()
    
    foo()  # 无限递归,会抛出异常,调用python对象超过最大递归深度
    

    示例2:间接调用自己

    def bar():
        print('from bar')
        foo()
    
    def foo():
        print('hello')
        bar()
    
    foo()  # 也会抛出异常
    

    为何无限递归吧会抛出异常???
    因为无限的递归会导致内存溢出,所以python设定了最大的递归层数,我们应该给递归设置结束条件,然后返回

    import sys
    print(sys.getrecursionlimit())  # 可查看当前最大递归层数
    print(sys.setrecursionlimit(2000))  # 可设置新的最高递归层数
    

    递归调用

    应该分为两个阶段
    ①、回溯(挖井) :一层一层地递归调用下去
    ②、递推(从井里往外跳):在满足某一条件的情况下结束回溯,然后开始向上一层层返回
    小案例:计算年龄,小一说比小二多大十岁,小二比小三大十岁,小三比小四大十岁,小四比小五大十岁。

    salary(5) = salary(4) + 10
    salary(4) = salary(3) + 10
    salary(3) = salary(2) + 10
    salary(2) = salary(1) + 10
    salary(1) = 18
    
    '''递归书写思路'''
    n=1   salary(n) = 18
    n!=1  salary(n) = salary(n-1) + 10
    '''递归使用:'''
    def salary(n):
        if n == 1:
            return 18
        return salary(n-1) + 10
    
    res=salary(5)
    print(res)
    

    二分法使用场景

    关于算法的相关了解与学习笔记可查看本博客另一专题《算法》

    '''
    从小到大排列的一个数字列表,找某个数是否在其中,此处采用算法的方式,不使用python自带的in方法
    '''
    nums = [11, 13, 32, 47, 53, 73, 84, 91,101,111,222,333,444,5555]
    
    def binary_search(l,find_num):
        print(l)
        if len(l) == 0:
            print('find_num not exists')
            return
        mid_index = len(l) // 2
        if find_num > l[mid_index]:
            right_l=l[mid_index+1:]
            binary_search(right_l,find_num)
        elif find_num < l[mid_index]:
            left_l=l[:mid_index]
            binary_search(left_l,find_num)
        else:
            print('find it')
    
    binary_search(nums,85)
    

    递归的应用场景

    当你不知道该重复做多少次,但是知道在什么情况下该结束的时候,用递归会很好。

  • 相关阅读:
    ASP.NET程序中常用的三十三种代码
    .NET面试题之1
    Assembly ‘X’ could not be uninstalled because it is required by another application
    Globalization and Localization
    SQL 2005 Reporting Services:物理分页和逻辑分页 SSRS 2008 report export to PDF Cannot get size to work
    GAC 学习
    Repeating Tablix Headers In SSRS 2008
    How do work with NULL in TSQL
    Visual C++ Native and .NET Interoperability
    C# WinForm开发系列 Reporting Services
  • 原文地址:https://www.cnblogs.com/chiyun/p/14066260.html
Copyright © 2011-2022 走看看