什么是递归
递归——百度百科
程序调用自身的编程技巧称为递归( recursion)。递归做为一种算法在程序设计语言中广泛应用。 一个过程或函数在其定义或说明中有直接或间接调用自身的一种方法,它通常把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解,递归策略只需少量的程序就可描述出解题过程所需要的多次重复计算,大大地减少了程序的代码量。递归的能力在于用有限的语句来定义对象的无限集合。一般来说,递归需要有边界条件、递归前进段和递归返回段。当边界条件不满足时,递归前进;当边界条件满足时,递归返回。
简单来说
递归就是函数自己调用自己,也就是在函数内部调用函数本身的一种编写代码的方式。
利用这个行为,我们可以命令一个函数不断的重复相似的某个步骤,直到得到我们想要的答案
怎么写出来一个递归
递归有两种写法:
- 直接递归函数
- 尾递归
直接递归函数
直接递归函数就是将函数的再次调用写在函数体中,如下
int If(int sum, int time)
{
if (sum == all)return 1;
if (time == n+1)return 0;
if (If(sum + ms[time], time + 1) == 1)return 1;
if (If(sum, time + 1) == 1)return 1;
return 0;
}
尾递归
尾递归是将函数的再次调用写在尾部如下:通常在return语句进行递归的调用
int fun(int sum)
{
if
{
(sum == 1)return 1;
}
else
{
return sum*fun(sum-1);
}
}
现在我们已经知道了什么是递归,那么递归怎么去用呢?
如何使用递归
怎么构建一个递归?
回头来看:我们可以命令一个函数不断的重复相似的某个步骤,直到得到我们想要的答案
如果说我们正常编写程序思考问题的方向是正向,那么递归的思考方式是逆向的,从结果或最后的节点出发,得到每一次重复操作直接的关系
那么,递归的设计主要就分为两个部分:
-
递归函数重复的操作
-
递归何时停止
用一个例子来教会搭建递归
我们先使用一个简单的例子,从1加到n,
对于这个问题,我们有以下几个思考:
-
n是未知数
-
无论n为多少始终从1开始,到n结束
从逆向的角度思考,我们能得知,1是不会改变的起点,反过来,1也是永远不变的终点,所以我们的终点就是1,n与下一层的计算是什么呢?相加!相加就是重复的运算。以此,我们构建出一个递归模型:
int fun(int sum)
{
if
{
(sum == 1)return 1;
}
else
{
return sum+fun(sum-1);
}
//直接递归
int fun(int sum)
{
if
{
(sum == 1)return 1;
}
else
{
sum+=fun(sum-1);
}
return sum;
}