引言
从这个专栏开始,我们将会一起来学习算法知识。首先我们要一起来学习的算法便是递归。为什么呢?因为这个算法是我很难理解的算法。我希望通过写这些算法博客;来加深自己对于递归算法的理解和运用。当然,学习算法最快的方式便是通过刷题。但是今天这篇博客不会涉及到递归的题,而会涉及到一些关于如何运用递归算法的讨论。
一,递归
1.何为递归
其实递归便是一种自己调用自己的行为。比如说以下代码:
void fun(int n) { if (n == 0) { return; } cout << n << endl; fun(n - 1); }
这个代码在自己的函数体里面又调用了自己,所以便构成了递归。
2.递归三部曲
在使用递归的算法时首先便要找到重复的子问题,找到重复的子问题后便可以设计出一个递归函数头。在找到函数头以后的第二步便要找到递归函数的结束条件,这便是函数递归的出口。第三步便是只关心解决一个子问题的步骤然后写出函数体。
总结一下便是如下步骤:
1.找到重复的子问题,设计出函数头。
2.找到函数递归的结束条件,找到递归的出口。
3.只关心一个子问题的解决,设计出函数体。
如斐波那契数列问题。斐波那契数列要我们找到第n个数的值。现在我们根据以上步骤来实现一下斐波那契数列的递归解法。
1.重复的子问题:第n个数的值是前两个数的和。所以只设计一个参数来表明是第几个数。
2.递归结束条件:第一个与第二个数的值是固定的,都是1。所以,当递归到n==1或者n==2时便返回1终止递归。
3.一个子问题的解决方案便是求出前两个数的和,再返回。
代码如下:
int fib(int n)//函数头 { if (n == 1 || n == 2)//递归出口 { return 1; } int sum = fib(n - 1) + fib(n - 2);//函数体 return sum; }
写在最后:
以上便是对递归的一般使用步骤的说明,接下来便一起进入到递归题目的练习中吧。