跳至正文
View Categories

< 1 min read

递归算法2 #

  1. 递归函数的三要素-递归的定义
  2. 递归函数的三要素-递归的拆解
  3. 递归函数的三要素-递归的出口

递归的定义 #

在使用递归算法之前,我们需要首先明确递归函数的定义,这一点和普通函数定义一样,包括递归函数的功能、参数、返回值都要有明确的定义。这些都是根据解决问题的需要由自己定义的。
我们以求解从1累加到n的和为例,首先定义mysum(n)函数,该函数的功能就是返回1~n累加的和。

def mysum(n):#mysum函数功能:返回1~n累加和,参数为n
	pass

递归的拆解 #

  • 递归问题的拆解是递归算法中最重要的一个环节,最基本的思想是将一个规模较大的问题,逐渐拆解成规模较小的问题,直到被拆解的问题能够十分容易被解决。
  • 在上例中我们很容易就可以想到,可以将求1~n的和,拆解成先求1~(n-1)的和再加上n,即在数学上有mysum(n)=mysum(n-1)+n的等式成立,求1~n-1的和同样可以使用上述的方法进行拆解。程序表示如下:
  • def mysum(n):
    	sum= mysum(n-1)+n#递归函数地拆解
    	return sum

    递归的出口 #

  • 调用上述递归函数mysum(n)时候会出现递归深度溢出的问题,可以想一想为什么?一个简单的解释就是该递归函数没有出口,实际上在执行mysum(n)函数第二句:sum= mysum(n-1)+n时,函数会被一直拆解下去,陷入一个死循环,导致递归没有回溯的过程。
  • 任何一个有意义的递归函数都要有自身的边界条件,也即是递归函数的出口。上述递归函数mysum(n)逐步拆解成mysum(1)时,返回值显然是1,可以将当n等于1,作为递归的出口
  • def mysum(n):
    	if n==1:
    		return 1 #递归的出口
    	sum= mysum(n-1)+n#递归的拆解
    	return sum

    小结 #

  • 掌握递归的三要素
  • 理解常见问题的递归解答思路
  • 习题 #

    1. 在mysum(n)的递归函数中,我们将递归的出口放在了递归问题拆解的前面,想一想为什么?能够交换位置吗?
    2. 使用循环迭代的方式实现mysum(n)的功能,并尽量找出它与递归方式的不同