python系列教程203——必须使用递归

Posted 人工智能AI技术

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python系列教程203——必须使用递归相关的知识,希望对你有一定的参考价值。

朋友们,如需转载请标明出处:https://blog.csdn.net/jiangjunshow

声明:在人工智能技术教学期间,不少学生向我提一些python相关的问题,所以为了让同学们掌握更多扩展知识更好地理解AI技术,我让助理负责分享这套python系列教程,希望能帮到大家!由于这套python教程不是由我所写,所以不如我的AI技术教学风趣幽默,学起来比较枯燥;但它的知识点还是讲到位的了,也值得阅读!想要学习AI技术的同学可以点击跳转到我的教学网站。PS:看不懂本篇文章的同学请先看前面的文章,循序渐进每天学一点就不会觉得难了!

在前面的文章中,我们说到了可以使用循环语句来替代递归。但是,有时候必须使用递归,或者说使用递归才是更方便的解决方案。

考虑像下面这样的一个任务:计算一个嵌套的子列表结构中所有数字的总和:

[1,[2,[3,4],5],6,[7,8]] # Arbitrarily nested sublists

简单的循环语句在这里不起作用,因为这不是一个线性迭代。嵌套的循环语句也不够用,因为子列表可能嵌套到任意的深度并且以任意的形式嵌套。相反,下面的代码使用递归来对应这种一般性的嵌套,可以顺序地访问子列表:

def sumtree(L):

    tot = 0

    for x in L:                                # For each item at this level

        if not isinstance(x,list):

            tot += x                           # Add numbers directly

        else:

            tot += sumtree(x)                  # Recur for sublists

    return tot




L = [1,[2,[3,4],5],6,[7,8]]             # Arbitrary nesting

print(sumtree(L))                              # Prints 36




# Pathological cases




print(sumtree([1,[2,[3,[4,[5]]]]]))        # Prints 15 (right-heavy)

print(sumtree([[[[[1],2],3],4],5]))        # Prints 15 (left-heavy)

尽管出于简单性和高效率的目的,对于线性迭代通常应该使用循环语句而不是递归,但我们会发现像上面示例一样的必须使用递归的情况还是很多的。

以上是关于python系列教程203——必须使用递归的主要内容,如果未能解决你的问题,请参考以下文章

python系列教程201——递归函数

python系列教程201——递归函数

二维数组中所有岛屿之间的最大总和是多少?必须使用递归

python系列教程202——循环语句与递归

python系列教程202——循环语句与递归

Python进阶 —— 尾递归