算法与数据结构学习笔记系列——递归(1)

先在文章的开头自我声明下,由于我水平有限,所以可能写出来的东西有些小问题什么的,希望看到的同学能够指正下,能够一起进步。

正文开始。

其实之前也看到过很多用递归方法解决的问题,很多情况下我们知道这题得用递归的方法进行解决,但是就是写不出完整的程序,由此我把递归问题分为基础性和复杂性两类。复杂性问题我之后研究好了以后再分享给大家我个人的经验,今天主要谈谈基础性问题。

首先,什么是基础性的递归问题。在我看来就是能够用大脑一步想出来递归表达式的,可能这句话看上去有点废话的感觉,举几个经典例子我想大家应该就能明白我说的了。

问题一:给定整数N,返回斐波那契数列的第N项。

解决:菲波那切数列,就是形如1,1,2,3,5,8···的数列,它的特征在于第三项等于前两项的和,所以我们可以轻易地写出以下的递推式f(N)=f(N-1)+f(N-2),这是很容易理解的。但是还有一个问题,递归必须得有结束,在这里就是当式子递归到最前面两项时返回,所以很明显,N=12时就得返回,当然如果一开始输入的N<1,那么直接就是0了。可以写出以下的程序:

 public int f(int N)
    {
	   if(N < 1)
	   {
		   return 0;
	   }
	   else if(N == 1 || N == 2)
	   {
		   return N;
	   }
	   return f(N-1)+f(N-2);
	}


问题二:假设农场中成熟的母牛每年只会生1头小母牛,而且永远不会死,第一年农场有1只成熟的母牛,从第二年开始,母牛开始生小母牛。每只小母牛3年之后成熟又可以生小母牛。给定整数N,求出N年后小母牛的数量。

解决:类似于上一题的斐波那契数列,我们可以站在第N年的角度考虑这个问题:今年的母牛数量是怎么来的?我们首先肯定能知道,至少去年的母牛今年肯定在。这样f(N)至少等于f(N-1)。然后由于题中又说母牛可以生小牛,且每只小母牛三年成熟后才可以生小牛,所以还会增加3年前母牛数量的小母牛。所以f(N)还需要加上f(N-3)。简单这样解释可能还是无法很清楚的解释明白为什么增加的是f(N-3),咱们也可以仔细分拆开来开。由于今年的牛必定包括去年的牛的数量,而且只有在今年成熟的牛才能生小牛,去年的牛中必定是存在今年无法成熟的牛的,那么问题的关键在于今年到底多少牛是成熟的。那么只有三年前新生的小牛和当时已经成熟的母牛在今年是成熟的,这正好是当年牛的数量,也就是f(N-3)。所以f(N)=f(N-1)+f(N-3)。具体的程序就不列的,和上一题很类似。在N=1,2,3时返回。


问题三:给定整数N代表台阶数,一次可以跨2个或者一个台阶,返回有多少种走法。

解决:还是同样的思路,假设我现在在第N阶台阶上,我们得考虑这第N阶台阶是怎么走到的。可能性一是跨了一个台阶上来的,那么走法一共是f(N-1),可能性二是跨了两阶台阶上来的,那么走法是f(N-2),所以可以列出f(N)=f(N-1)+F(N-2)。




综上所述,对于简单的递归问题,我们不妨将自己设身处地到第N时的情况,考虑这f(N)是怎么来的,这样也许对我们解题有一定帮助。当然,递归的效率其实是非常低的,上面三道题其实都有高效的动态规划的解法,在以后我学习了后分享给大家。



最后,如果有同学看到了这个博客,还是希望能够指出我的问题所在,毕竟这只是我自己的学习心得,还有需要进步的地方。也希望大家能给我推荐下优秀的关于递归的博客,好让我继续学习下,大家一起进步。

你可能感兴趣的:(递归)