递归函数Python递归函数的实现和应用
递归函数是指函数自己调用自己,直到满足某个条件才停止,该函数的实现过程常用树形结构图来表示,是算法设计和问题解决的重要方法之一。
一、递归函数的实现
递归函数是指函数内部调用函数自己,实现过程中,需要满足以下三个条件:
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]
以上只是几个递归函数的应用实例,在实际编程中,通过递归实现算法的优化、实现特定的搜索、排序和操作等,是非常有效的方法和思想,同时也存在一定的风险,如存在终止条件不明确等问题,需要谨慎使用。
