跳至正文
View Categories

< 1 min read

递归算法 #

  1. 递归的概念
  2. 递归函数调用执行过程
  3. 递归函数的理解

递归的概念 #

直接或者间接调用自身的算法称为递归算法。编程中直接或间接调用函数本身的函数称为递归函数。例如以下递归函数my_print(n)的功能是逐行打印1~n,在实现该函数的过程中又调用了my_print(n)函数本身,因此该函数是递归函数。

def my_print(n):
	if n<1:
		return
	else:
		my_print(n-1)#my_print()函数的递归调用
		print(n)
my_print(5)

递归函数调用执行过程 #

  • 上述函数的递归调用执行过程如下图所示。
  • 调用my_print(5)函数时,my_print(5)调用my_print(4),my_print(5)函数需要my_print(4)执行完毕,才能接着向下执行(想一想为什么?)
    同样my_print(4)调用my_print(3)需要my_print(3)执行完毕,才能接着向下执行,依次类推。当调用到my_print(0)时,my_print(0)函数能执行完毕返回,然后整个程序回溯执行my_print(1),my_print(2)……my_print(5),逐行打印1~5。

递归函数的理解 #

相对于上述的递归, 我们更加容易理解迭代,事实上通过一个简单的迭代也能实现上述的功能。在迭代中我们将循环变量依次变化1~5,逐行依次打印。

for i in range(1,6):
	print(i)

而递归的思路则与上述不同,首先我们先假设已经实现了函数my_print(n),它的功能就是逐行打印1~n。那么我们可以把逐行打印1~n的任务分为逐行打印1-(n-1),打印n,依次类推,直到把问题拆分到十分易于解决为止。如下图所示:

小结 #

  • 掌握递归的概念,识别出递归函数
  • 能够理解递归函数的调用和回溯过程,能够画出递归函数调用执行图

习题 #

  1. 谈一谈自己对递归的理解,说一说递归与循环的不同
  2. 所有循环迭代能够解决的问题,理论上都能使用递归解决,尽量多找一些例子进行验证