环境搭建&递归算法(1)
小标题:00|开发环境搭建|递归(一)| 基本数列递归
本篇简介
本篇文章和视频主要介绍了C++开发环境的搭建和递归算法中的基本数列递归
视频
引入
大家好,欢迎来到《系统入门 C++算法课》的第 0 期
在本系列课程中我将带领大家使用 C++从零开始入门算法、并实现一些经典算法。
试图帮助大家练习基础语法的同时,循序渐进的理解算法,实现算法。
在观看学习本系列课程之前,我希望你拥有 C 语言或者 C++语言的基础,了解基本的变量、基础数据类型、控制语句、函数等语法。
如果你没有基础的话,也可以在了解了相关概念的同时学习本系列。
接下来,介绍一下本系列课程的开发环境,在整个系列中,都将使用 DEV-C++ 这个软件,它是一个开源免费的 C/C++ 集成开发环境,其他虽然也有很多很好用的编辑器或集成开发环境,但考虑到观看视频的用户可能有一部分是准备参加各种编程比赛的学生,在一些编程比赛中官方推荐使用的开发环境是 DEV-C++,因此本系列课程选用了它。
环境搭建
接下来的时间我们一起安装开发环境并进入第一个知识的学习。
打开浏览器搜索 DEV-C++或者搜索 DEV-CPP,找到这个网址,打开之后进行下载。
软件的安装包链接我也放在了视频简介中,大家可以将它下载下来进行安装
双击软件进行安装,首先会弹出语言的选择,这里先选择英文安装即可,紧接着选择 I agree、选择 next、在这里我们可以选择软件安装的位置,点击 Browse 按钮,打开文件管理,我选择安装在 D 盘,因此在 D 盘创建了一个新的名为 DEV 的文件夹,选择这个位置,完成之后点击 Install 进行安装。安装完成之后首次打开会弹出一个设置选择界面,在这里选择中文,点击 Next,接下来是自定义颜色等,可以根据个人喜好修改或者不修改直接 Next,设置完成点击 OK 即可。
使用
接下来我们讲讲软件的基本使用,使用快捷键 Ctrl + n,可以快速新建一个源代码文件,或者点击左上角文件-新建-源代码,效果是一样的,在这个界面中就可以编写代码了。调整代码的文字大小可以按下 Ctrl 键之后滚动鼠标滚轮。
由于我们需要使用 C++11 的标准,还需要进行一个设置,打开工具-编译选项界面勾选编译时加入一下命令,在下方的框中补充一行代码:-std=c++11,点击确定即可。
在编辑器的左侧有项目管理的框,我们学习算法基本用不上项目管理,因此可以把这个框关掉,点击是视图菜单,把项目管理勾选掉即可。此时我们的开发环境就准备完成了。
递归
基本数列递归
接下来我们来学习第一个知识点——递归
有的朋友可能不会把递归当做算法,课程从递归开始的原因在于递归是很多算法的基础,因此第一个知识点定为了递归。
简单解释递归就是函数的自我调用。这么解释它是不好理解的,我们直接使用它的应用场景来理解。
这里有 5 个数:
1 4 7 10 13
请发现它们之间的规律并在弹幕打出下一个数(停顿)
没错它是一个等差数列,每项之间相差 3
那么它的规律可以写作 A(n) = A(n-1) + 3
即当前项的值是前一项的值加 3
因此现在要求出第 6 项的值,那么就必须知道第 5 项的值,要知道第 5 项的值,就必须知道第 4 项的值,以此类推,直到第一项。
这么描述可能很清晰了,那么和递归有什么关系呢?
看以下需求:
使用递归方式求解等差数列 1 4 7 10 13 ... 第 n 项的值,要求输入 n ,输出第 n 项的值。
我们来编写代码:
# include <iostream>
using namespace std;
int f(int n)
{
int res;
return res;
}
int main()
{
return 0;
}
这是 C++ 代码的基本框架,如果你有基础的话,这里应该很容易理解。
接着在这里定义一个函数,在定义函数时,首先思考这个函数是用来干嘛的,这里是求等差数列的第 n 项的值,对于这个等差数列来说,第 n 项的值一定是个整数,因此这个函数的返回值是一个整数。
所以首先确定函数的返回值是 int ,紧接着取一个函数名字 f ,函数是求数列的第 n 项的值,因此需要一个参数接收 n,它也是整数类型。
注意,函数如果有返回值的情况,先把返回值写好,以免忘记,这是一个比较好的习惯,返回值是一个整数,因此定义一个整数变量用来返回。
这个函数可以求出第 n 项的值,最终赋值给 res 用来返回。对于这个数列来说,第 n 项的值是第 n-1 项的值 +3 ,这个函数既然可以求第 n 项的值,那么自然也可以求第 n-1 项的值,所以可以调用它自己来求出第 n-1 项的值,也就是 f(n-1) + 3 。
我们来演示一下这个函数
假设我们要求出第 6 项的值
则是
f(6) =
要求出第 6 项的值,则需要求出第 5 项的值 + 3
f(6) = f(5) + 3
此时要求出 f(5) 的值,则需要知道前一项 f(4) 的值 + 3
f(6) = f(5) + 3
= ( f(4) + 3 ) + 3
此时需要知道 f(4) 的值,则需要知道 f(3) 的值 再+ 3
f(6) = f(5) + 3
= ( f(4) + 3 ) + 3
= ( ( f(3) +3 ) + 3 )
接着再求 f(3),等于 f(2) + 3
f(6) = f(5) + 3
= ( f(4) + 3 ) + 3
= ( ( f(3) + 3 ) + 3 )
= ( ( ( f(2) + 3 ) +3 ) + 3 )
再求 f(2) 的值,等于 f(1) +3
f(6) = f(5) + 3
= ( f(4) + 3 ) + 3
= ( ( f(3) + 3 ) + 3 )
= ( ( ( f(2) + 3 ) +3 ) + 3 )
= ( ( ( ( f(1) + 3 ) + 3 ) +3 ) + 3 )
再求 f(1) 的值,等等,f(1) 是第 1 项,第 1 项前面还有其他项吗?显然没有了。
因此递归函数不能没有限制,递归需要起始项,避免无限制递归。
所以我们修改一下代码,给这个函数一个起始项,就是第一项,也就是 n=1 的时候。
# include <iostream>
using namespace std;
int f(int n)
{
int res;
res = f(n-1) + 3;
return res;
}
int main()
{
return 0;
}
当 n = 1 时,值为 1。
可以使用一个判断语句来实现
# include <iostream>
using namespace std;
int f(int n)
{
int res;
if (n == 1)
{
res = 1;
}
else
{
res = f(n-1) + 3;
}
return res;
}
int main()
{
return 0;
}
在开发环境中把这个函数调用一下,测试结果。结果正确。
基本数列递归练习题
到这里也许你已经听懂了递归函数的使用,但是听懂和学会可能不太一样,因此这里给出两道题,供大家学完之后练习。大家可以把自己的答案编写在评论区,编写不出来的小伙伴可以去评论区寻求帮助,我也会看评论区的~
题 1:
使用递归函数求解等比数列
描述:输入一个整数 n ,求出等比数列 2 4 8 16 32 ... 的第 n 项的值
输入:一个整数 n
输出:一个整数,等比数列的结果
输入样例:6
输出样例:64
题 2:
使用递归函数求解阶乘
(阶乘举例,5 的阶乘:5!= 54321)
描述:输入一个整数 n,求出 n 的阶乘结果。
输入:一个整数 n
输出:一个整数,n! 的结果
输入样例:5
输出样例:120
除了课程本身之外,我也会单独更新一些相应的题目类课程,带大家解题,学习解题思路。
下一期,我们将继续探讨递归,以及递归的弊端。
好了以上就是本期的所有内容了,如果觉得对你有所帮助的话,欢迎关注~