超详细递归问题总结

超详细递归问题总结

递归作为算法中常见的基本问题,对此想做一些总结

  • 递归的定义

    如图,以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)
  • 综上
    综上,对于简单的递归问题,分析时可以参考这篇文章,因为时间有限,要投简历找工作,故递归问题先总结在这,后续会进一步完善递归的优化和动态规划的内容,完。如果觉得文章写的还不错的,请大家帮忙点个赞,评论。
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值