递归算法流程图设计(用C语言实现递归,即程序调用本身,这是一个非常重要的概念)
今天为什么选择“递归”作为文章的话题呢,主要原因是,我在做题的时候发现,很多时候都会用到递归这一概念,特别是之后会讲到的比较麻烦的一些排序算法,比方说快速排序。
递归递归,单纯从字面意思角度来说,就是重新递过来,可以知道,这应该是一个循环往复的过程。
在我们的程序当中呢,重复调用自身就可以说是递归,可以发现,这也是一个循环的过程,
以一张流程图为例:
可以很直观地发现,与我们直接写子函数不同,用递归的方法,首先子函数就会不断地调用它自己本身了,其次是在子函数内不满足条件的时候,再重复调用该子函数,实现一个子函数里调用子函数的过程,之后满足条件的话,才会再主函数里调用该子函数。
当然,讲了这个逻辑后,还是得拿具体的题目来实际操作一下,才能更好地理解。
用递归方式输出100以内的偶数
这里为什么不进行奇偶数的判断,那是因为在进行递归的时候,我们主要目的是要在子函数里再次调用该子函数,而对一个数进行奇偶判断,只需要调用该子函数一次即可。
所以,这里要明确一个概念,递归指的是要多次用到该子函数的时候,可以在该子函数内对程序自身调用,以达到一个简化程序的目的。
所以,选择用递归函数来输出100以内的偶数比较直观一些。
代码实现
//输出100以内的偶数,主要用到int类型的函数
#include<stdio.h>
int evenodd(int n){
if(n==0){
return 0;
}
return evenodd(n-1)+2;//递归调用自身
}
int main() {
for(int i = 0; i < 51; i++){
printf("%d ",evenodd(i));
}
}
很明显,与我们之前遇到的直接写一个函数调用有区别,区别就在于:
1、我没有把打印语句放在子函数里。
2、子函数的类型不是void了,而是变成了int有返回值类型,返回值就是该子函数本身构成的式子。
测试结果
用递归的方式输出斐波那契数列
我们之前在讲函数的时候,也提到过输出斐波那契数列,那么在针对递归函数的时候,我们自然也要拿出来提一提。
仔细思考一下,什么时候我们需要调用斐波那契数列该函数本身,斐波那契数列大家也很清楚,就是第一位加第二位等于第三位,那么第一位第二位的值我们是不是需要给定的,之后只需要不断返回调用函数本身不就行了么。
所以很明确,正如之前画的流程图所写,得满足子函数内的条件才会在主函数里调用,否则就是子函数里不停调用自身,当然,在这道题目里呢,它是不断在调用自身的,所以没有一定说满足不满足的情况。
代码实现
//用递归的方法来输出斐波那契数列
#include<stdio.h>
int fibonacci(int n){
if(n==0){
return 0;
}
if(n==1){
return 1;
}
return fibonacci(n-1)+fibonacci(n-2);//递归自己本身,因为下一个就是n=2
}
int main() {
for(int i = 0; i < 15; i++){
printf("%d ", fibonacci(i));
}
printf("\n");
}
测试结果
总结
递归其实是一种非常方便的办法,能够减少程序的重复度,但是呢,也要注意,在简单的题目面前,能尽量少用就少用,毕竟也没简单到哪里去。