上一篇博客我们初步认识了函数的大致种类以及应用,那么接下来来向大家介绍一下函数中最令人头疼的函数递归问题。
1.递归原理以及用法的讲解
首先递归顾名思义是一件事情反复做许多次之后产生的结果。你可以将其理解为函数与函数的连续套用。直到条件不满足时套用结束,之前进行的函数一次实行的操作。下面我们来用题目来举一个例子:
请问如何用函数将1234按照位正序打印出来1234?拿到题目我们第一印象就是取余之后再打印思路没错但是你会发现打印之后呢?
你会发现使用while的结果是4321,并不是1234那么我们正好可以借此来认识一下函数的递归。
#include<stdio.h>
void reverse(int i)
{
if (i<10)
{
printf("%d ",i);
}
else
{
reverse(i / 10);
printf("%d ",i % 10);
}
}
int main()
{
int i = 0;
scanf("%d", &i);
reverse(i);
return 0;
}
从上述步骤我们可以很清楚的观察到要想正序输出1234那么也就是说递归得是逆向进行的,事实结果也正和我们想象的一样。程序的运行是正向进行的,但是当递归结束的时候确实反向输出的。程序运行时遇到递归会直接进入递归程序当中,当递归程序释放的时候,会依次执行其他再进入递归时未执行的程序,本次也就是执行打印操作。
可以将递归程序理解为一连串的门,当你进入一扇门之后你发现了另一扇门再进去到最后门的后面是一堵墙,所以你要原路返回,在进去的时候你没必要拿上屋子里发现的财宝,因为你还要出来,当你走出来的时候你在搜索整个屋子里的程序。
在此我特别指出:一定要注意递归结束时的限定条件,要不然会导致程序崩溃。你想哈无数个门怎么走都走不完总会崩溃的对吧?
相信通过上面的讲解,你对于递归程序一定有了不一样的见解,那么我们就来运用递归程序向大家介绍一下其用法和解体的奥秘吧。
2.斐波那契数列的解决
我们先来了解一下什么是斐波那契数列,这是一组数任意一位上的数字都可以写成相邻前两位数字之和。也就是1 1 2 3 5 8 13 21 34 55......我们可以通过观察进行判断任意一位上的数字都可以写成前两位之和也就是说可以写成
fab(i)=fab(i-1)+fab(i-2)
这样的形式。那么fab(i-1)同样可以这么向下写下去,照这么看来,这不就是两个递归程序相加吗?那么我们按照我们的思路往下写程序:
#include<stdio.h>
int fab(int number)
{
if (number <= 2)
{
return 1;
}
else
{
return fab(number-1) +fab(number - 2);
}
}
int main()
{
int number = 0;
scanf("%d", &number);
printf("%d",fab(number));
return 0;
}
最后就会得到这样的效果了,也就是输入一个数字就会得到处于该位置的斐波那契数。
对于函数递归的理解和认识要想更加深刻的话还是得靠自己多多练习,只要自己肯下苦功夫的话,相信我们每一个人都会有不一样的收获的!
那么本次博客的内容也就全部结束了,祝你天天开心。