欢迎访问宙启技术站
智能推送

递归函数Python递归函数的实现和应用

发布时间:2023-06-22 17:42:35

递归函数是指函数自己调用自己,直到满足某个条件才停止,该函数的实现过程常用树形结构图来表示,是算法设计和问题解决的重要方法之一。

一、递归函数的实现

递归函数是指函数内部调用函数自己,实现过程中,需要满足以下三个条件:

1.有一个明确的终止条件:当满足该条件时,递归将停止。

2.每次递归调用,当前问题的规模都会被缩小,直到最终达到终止条件。

3.将所有子问题的解合并起来,得到最终结果。

以求 n 的阶乘为例。

def factorial(n):

    if n==1:

        return 1      #终止条件

    else:

        return n * factorial(n-1)  #向终止条件靠近的递归过程

print(factorial(5))    #output:120

上面程序的实现过程是这样的:先检查输入的变量是否等于1,如果是则返回1;否则函数会递归调用自己,不断减少n的值,直到2,然后函数返回2×1的结果,再递归返回3×2×1,最后计算5×4×3×2×1。

递归函数的形态没有规定,可以通过不同编程方式来实现,也可以在函数内部定义多个递归函数,以满足特定的需求。

二、递归函数的应用

递归函数常用于解决有递归定义的数学问题、遍历搜索、子问题问题、动态规划、图形结构和树形结构等问题。将常见的几种递归问题介绍如下:

1.斐波那契数列问题

Fibonacci sequence(斐波那契数列):1,1,2,3,5,8,13,21,…, 项和第二项为1,从第三项开始,每一项都是前两项之和。用F(n)表示数列的第n项。

递归函数实现:

def fib(n):

    if n==1 or n==2:

        return 1       #终止条件

    else:

        return fib(n-1) + fib(n-2)  #递推过程逐渐缩小n,直到达到终止条件

print(fib(6))                #output:8

2.汉诺塔问题

汉诺塔是一种经典的问题。有三个柱子(A, B, C),其中A柱子上有若干盘子,盘子大小不等,越靠上的越小,它们按照大小顺序重叠摆在A柱子上。规则如下:

1)只能移动某个柱子顶部的盘子;

2)任何时刻不能将大盘子放在小盘子上面。

盘子的移动过程不同于打开一个普通的盒子,因为移动过程需要递归来解决。

递归函数实现:

def move(n, a, b, c):

    if n == 1:

        print(a, '-->', c)  #终止条件

    else:

        move(n-1, a, c, b)  #递归过程1:将n-1个盘子从a移动到b

        print(a, '-->', c)  #递归过程2:将第n个盘子从a移动到c

        move(n-1, b, a, c)  #递归过程3:将n-1个盘子从b移动到c

#测试代码

move(3, 'A', 'B', 'C')

#output:

A --> C

A --> B

C --> B

A --> C

B --> A

B --> C

A --> C

3.递归遍历列表

递归遍历列表的问题,通常被称为“列表平铺”。

递归函数实现:

def flatten(arr):

    result = []

    for i in arr:

        if isinstance(i, list):

            result.extend(flatten(i))  #递归处理列表

        else:

            result.append(i)   #终止条件:i不是列表

    return result

#测试代码

print(flatten([1, 2, [3, [4, 5]], 6]))    #output:[1, 2, 3, 4, 5, 6]

以上只是几个递归函数的应用实例,在实际编程中,通过递归实现算法的优化、实现特定的搜索、排序和操作等,是非常有效的方法和思想,同时也存在一定的风险,如存在终止条件不明确等问题,需要谨慎使用。