递归函数

Posted mling

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了递归函数相关的知识,希望对你有一定的参考价值。

一、递归函数定义

  • 什么是递归: 在一个函数里在调用这个函数本身
  • 最大递归层数是:997
  • 最大递归层数可以修改,建议不要去修改 (如果997层数递归都没解决你的问题那只有两个原因:一、你的代码不适合用递归,二、你的代码太烂~
  • count = 1
    def xiake():
    global count
    print(count)
    print(‘下课‘)
    count+=1
    xiake()
    xiake()
  • 二、递归的特性:

    • 1、递归函数必须有一个明确的结束条件
    • 2、每进入更深一层的递归时,问题规模现对于上一层递归都会减少
    • 3、相邻两次重复之间有紧密的联系,前一次要为后一次做准备(通常前一次的输入就是作为后一次的输入)
    • 4、递归效率不高,递归层次过多会导致栈溢出

    三、递归函数的优缺点

    • 递归函数的优点: 定义简单,逻辑清晰,理论上,可以说所有的递归函数都可以写成循环的方式,但循环的逻辑不如递归清晰
    • 递归函数的缺点: 使用递归函数需要注意防止栈溢出

    四、下面就用实例说明一切

    • 递归函数解决嵌套的列表操作
    lst = [‘a1‘,‘a2‘,[‘a11‘,‘a22‘,[‘b11‘,‘b22‘,[‘ccc‘,‘ddd‘]]]]
    def look_up(lst): # [‘a1‘,‘a2‘,[‘a11‘,‘a22‘,[‘b11‘,‘b22‘,[‘ccc‘,‘ddd‘]]]]
        for i in lst:
            if type(i) is list: # [‘a11‘,‘a22‘,[‘b11‘,‘b22‘,[‘ccc‘,‘ddd‘]]]
                look_up(i) # lst([‘a11‘,‘a22‘,[‘b11‘,‘b22‘,[‘ccc‘,‘ddd‘]]])
            else:
                print(i) # ‘a1‘   ‘a2‘
    look_up(lst)
    
    • 求l1列表中所有数的和
    l1 =[1,[90,80.2],4,[5,6,7,8,[6,3,2]]] # 求列表中所有元素的和
    def rec_sum(lst):
        sum_n = 0
        for n in lst:
            if type(n) is list:
                ret = rec_sum(n)
                sum_n += ret
            elif type(n) is int or  type(n) is float:
                sum_n += n
        return sum_n
    ret1= rec_sum(l1)   # [1,[90,80.2],4,[[6,3,2],5]]
    print(ret1)  结果:212.2
    
    • 用递归实现阶乘
    def fn(n):  # n=3
        if n>1:
            return n * fn(n-1)
        else:
            return n
    ret = fn(10)
    print(ret) 结果:3628800

以上是关于递归函数的主要内容,如果未能解决你的问题,请参考以下文章

vue递归组件的一些理解

哈斯克尔。我很困惑这个代码片段是如何工作的

如何在自定义PyYAML构造函数中处理递归?

JavaSE 方法的使用

JavaScript - 代码片段,Snippets,Gist

Java基础之方法的调用重载以及简单的递归