Python入门教程第25篇 递归函数

Posted 不剪发的Tony老师

tags:

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

本篇我们来学习一下 Python 递归函数,它可以简化我们的代码。

递归函数简介

递归函数(recursive function)是指可以自我调用的函数。以下 fn() 函数是一个递归函数,因为它在函数体中调用了自己:

def fn():
    # 一些代码
    fn()
    # 其他代码

另一方面,递归函数需要存在一个停止自我调用的条件。因此,我们可以增加一个 if 语句:

def fn():
    # ...
    if condition:
        # 停止自我调用
    else:
        fn()
    # ...

通常来说,我们使用递归函数将一个难以解决的问题分解为多个易于解决的小问题。

在编程语言中,递归函数通常会储限制数据结构和算法中,例如树、图以及二分查找等。

递归函数示例

下面我们来看几个递归函数示例。

示例一:简单递归函数

假如我们想要开发一个倒数计算的函数,用于从指定数字倒计到零。举例来说,当我们调用该函数从 3 开始计数,它的输出结果如下:

3
2
1

以下是 count_down() 函数的定义:

def count_down(start):
    """ Count down from a number  """
    print(start)

接下来调用该函数:

count_down(3)

此时输出结果只有数字 3。为了能够输出 3、2、1,我们需要执行以下操作:

  • 首先,调用 count_down(3) 输出数字 3。
  • 然后,调用 count_down(2) 输出数字 2。
  • 最后,调用 count_down(1) 输出数字 1。

为了实现以上结果,我们需要在 count_down() 函数内定义一个逻辑,使用参数 2 和 1 调用 count_down() 函数。为此,我们需要递归调用 count_down() 函数。

以下代码定义了一个递归的 count_down() 函数并且使用参数 3 调用该函数:

def count_down(start):
    """ Count down from a number  """
    print(start)
    count_down(start-1)

count_down(3)

如果执行以上代码,将会返回下面的错误:

RecursionError: maximum recursion depth exceeded while calling a Python object

原因在于 count_down() 函数会不停自我调用,除非系统强制停止程序运行。因此,我们需要在数字到达 0 时停止调用。我们可以增加一个条件:

def count_down(start):
    """ Count down from a number  """
    print(start)

    # 下一个数字大于 0 时继续调用
    next = start - 1
    if next > 0:
        count_down(next)

count_down(3)

输出结果如下:

3
2
1

以上示例中, count_down() 函数只会在下一个数字大于 0 时调用自己。也就是说,当下一个数字为 0 时,他会停止自我调用。

示例二:计算数字序列的和值

假如我们想要计算数字序列 1 到 100 的和值,最简单的方法就是使用 for 循环和 range() 函数:

def sum(n):
    total = 0
    for index in range(n+1):
        total += index

    return total


result = sum(100)
print(result)

输出结果如下:

5050

如果使用递归方法,我们可以使用以下算法计算序列 1 到 n 的和值:

  • sum(n) = n + sum(n-1)
  • sum(n-1) = n-1 + sum(n-2)
  • sum(0) = 0

sum() 函数在参数大于 0 时递归调用自己。

以下示例定义了一个递归版本的 sum() 函数:

def sum(n):
    if n > 0:
        return n + sum(n-1)
    return 0

result = sum(100)
print(result)

可以看出,递归函数更加简洁易读。

如果使用三元运算符,sum() 函数还可以更加简洁:

def sum(n):
    return n + sum(n-1) if n > 0 else 0

result = sum(100)
print(result)

总结

  • 递归函数是指自我调用的函数。
  • 递归函数需要定义一个停止自我调用的条件。

以上是关于Python入门教程第25篇 递归函数的主要内容,如果未能解决你的问题,请参考以下文章

Python入门教程第39篇 reduce()函数

Haskell入门篇三:递归

Python基础入门深浅拷贝函数内置函数文件处理三元运算递归

Python入门之经典函数实例——第1关:递归函数 - 汉诺塔的魅力

Python入门之经典函数实例——第1关:递归函数 - 汉诺塔的魅力

(记录)python篇:六_ 函数2