超详细递归问题总结
递归作为算法中常见的基本问题,对此想做一些总结
-
递归的定义
如图,以n的阶乘为例,f(n)=n!=n*(n-1)!=n*f(n-1)
递归的定义可以拆解成两个词 递进和回归,先递进再回归-----这就是递归。这样理解应该最通俗易懂
另附上n的阶乘的python代码如下:
def factorial(n):
if n < 2: #0的阶乘和1的阶乘都为1
return 1
return n * factorial(n-1)
-
递归问题核心要素
我认为递归问题递归问题的核心要素有二:递归的结束条件和缩小递归的递推关系式
如何理解核心要素,我们还是从例子出发去解释。 -
案例
案例一:
斐波那契数列指的是这样一个数列 0, 1, 1, 2, 3, 5, 8, 13,21… 以递推的方法被定义为:f(0)=0,f(1)=1,f(n)=f(n-1)+f(n-2) (n>=2,n为正整数),如何通过代码实现?
解:
1.递归的结束条件,如题可知,f(0)=0,f(1)=1,是结束时的条件,这是从数学,直观上可以发现的,转变为代码为:
if n==0 :
return 0
elif n==1:
return 1
这里有个小技巧,因为f(1)和f(2)的时候都为1,所以可以把递归的结束条件看成f(1)=1,f(2)=1,优化后的代码为:if n<=2: return 1
2.缩小递归的递推关系式,即为f(n)=f(n-1)+f(n-2),代码可转换为:return f(n-1)+f(n-2)
找出了递归的结束条件和缩小的等价关系式后,题目也就差不多了,最后的代码为:
def f(n):
if n<=2:
return 1
rerun f(n-1)+f(n-2)
有些同学可能觉得这还是有些简单,没关系,我们慢慢来,这只是建高楼大厦的基层
案例二:
青蛙跳台阶(爬楼梯):
一只青蛙一次可以跳上1级台阶,也可以跳上2级台阶。求该青蛙跳上一个n 级的台阶总共有多少种跳法?
解:设跳上n级台阶有f(n)中跳法。
1.递归的结束条件,当有0个台阶时f(0)=0;只有1个台阶时,f(1)=1;只有两个台阶时,f(2)=2。故结束条件的代码可表示为if n<=2: return n
2.找出缩小递归的递推关系式:
第一种跳法,第一次跳了一个台阶,那还剩下n-1个台阶还没跳,即剩下n-1个台阶的跳法有f(n-1)种
第二种跳法,第一次跳了两个台阶,那还剩下n-2个台阶还没跳,则剩下的n-2个台阶的跳法f(n-2)种
所以,n个台阶的跳法f(n),可以等于f(n)=f(n-1)+f(n-2),由此可见这和案例一的斐波那契数列递推关系式一样,只不过递归的结束条件不一样。一般来说,找出递推关系式是这里面的难点。
最后的代码为:
def f(n):
if n <= 2:
return n
return f(n-1) + f(n-2)