美文网首页
关于递归学习

关于递归学习

作者: 投篮手型差 | 来源:发表于2018-11-27 15:38 被阅读0次

关于递归的学习

递归是一种优雅的问题解决方法,同循环相比,并没有性能优势,而是让解决方案更清晰,让程序更容易理解。

递归条件:recursive case

函数调用自己。

基线条件:base case

函数不再调用自己,避免无限循环。

需要用到一种数据结构-栈(stack),一叠数据,操作有两种,分别是:压入和弹出(删除和读取)。

计算机调用函数需要分配一块内存,当调用另一个函数时,当前函数暂停并处于未完成状态,变量也存储于其中。所以也会由于内存不足而导致栈溢出。

递归式解决问题

分而治之(dvide and conquer)的思想

递归式解决问题的方法。

  • D&C原理:
    1.找出基线条件;
    2.确定如何缩小问题规模,也能符合基线条件。

问题练习

递归练习题
'''列表求和'''
def Sum(arr):
    n = len(arr)
    print('列表长度为:'+str(n))
    print('当前列表:'+str(arr))
    print('列表第一个元素:'+str(arr[0]))
    print('--'*10)
    if len(arr)==1:
        #这一步通常会被忽略,基线条件达到以后,会返回一个值
        print('完成基线条件的返回值:'+str(arr[0]))
        return arr[0]
    return arr.pop(0)+Sum(arr)

运行结果如下:

>>>Sum([9,13,2,4,67,211,32])
列表长度为:7
当前列表:[9, 13, 2, 4, 67, 211, 32]
列表第一个元素:9
--------------------
列表长度为:6
当前列表:[13, 2, 4, 67, 211, 32]
列表第一个元素:13
--------------------
列表长度为:5
当前列表:[2, 4, 67, 211, 32]
列表第一个元素:2
--------------------
列表长度为:4
当前列表:[4, 67, 211, 32]
列表第一个元素:4
--------------------
列表长度为:3
当前列表:[67, 211, 32]
列表第一个元素:67
--------------------
列表长度为:2
当前列表:[211, 32]
列表第一个元素:211
--------------------
列表长度为:1
当前列表:[32]
列表第一个元素:32
--------------------
完成基线条件的返回值:32
338

'''计算列表元素个数'''
def Len(arr):
    print('当前列表:'+repr(arr))
    count = 0
    arr.pop()
    print('删除队尾元素后的列表:'+repr(arr))
    count +=1
    if arr ==[]:
        return count
    return count+Len(arr)

结果如下:

>>>Len([1,2,3])
当前列表:[1, 2, 3]
删除队尾元素后的列表:[1, 2]
当前列表:[1, 2]
删除队尾元素后的列表:[1]
当前列表:[1]
删除队尾元素后的列表:[]
3

但是当输入列表为[],会由于arr.pop()方法对象为空而报错。

'''找出列表中最大的数字'''
def findMax(arr):
    max_value = 0
    num =arr.pop()
    if arr ==[]:
        return num
    if max_value<num:
        max_value = num
        print('当前最大值:'+str(max_value))
        return max_value
    return findMax(arr)
>>>findMax([1,2,3,4,5])
当前最大值:5
5

书中练习的答案:

def sum(list):
     if list == []:
        return 0
     return list[0] + sum(list[1:])
def count(list): 
    if list == []:
        return 0
    return 1 + count(list[1:])

总结:看了书上的解法,真的是优雅,基线条件和递归条件一目了然,思路值得学习。

参考


《算法图解》

相关文章

  • 关于递归学习

    关于递归的学习 递归是一种优雅的问题解决方法,同循环相比,并没有性能优势,而是让解决方案更清晰,让程序更容易理解。...

  • Clojure 学习笔记 :10 美妙的递归

    Clojure 零基础 学习笔记 递归 尾递归 Clojure 学习笔记 :10 美妙的递归 递归,或者说函数的递...

  • vue组件递归

    管理系统中很多这样树形菜单显示的,这里要用到组件的递归来完成,这里我们来学习下vue关于组件递归的实现。 ...

  • Python精简入门学习(十)

    Python精简入门学习之递归函数-递归 -递归 -如图所示

  • 杂乱的学习笔记(20160916)

    递归算法 暑假在学习数据结构的时候一直对于递归有很大的疑问,最近很粗略地看了一下关于算法设计书籍里面的递归一节,有...

  • 关于递归

    设计递归算法可以分为以下几个步骤 1.思考递归算法的循环过程。为什么需要递归,每次递归会产生什么结果?递归次数怎么...

  • 关于递归

    递归:方法自己调用自己

  • 学习日记-04-关于 递归

    递归的基本思想是分解,让函数调用自己。在性能上,递归与循环一样,没有优势,但是递归很多时候在思路上更为清晰。 两个...

  • go递归

    1.递归的使用 使用递归快速排序 2.关于递归上下文的测试 运行的结果如下:

  • 理解递归

    递归的概述 摘取维基百科关于递归的描述:递归(英语:Recursion),又译为递回,在数学[https://zh...

网友评论

      本文标题:关于递归学习

      本文链接:https://www.haomeiwen.com/subject/yfwgqqtx.html