递归的原理
递归递归,字面意思就是递和归,递也就是你一直传递数据,归就是传递到最后返回的过程,这样说太抽象,先上一个代码在解释。
#include<stdio.h>
int Pnx(int a[], int x, int n, int i);
int main()
{
int a[5] = { 1,2,3,4};
printf("%d\n", Pnx(a,1,3,3));
return 0;
}
int Pnx(int a[], int x, int n, int i)
{
if (i > 0)
return a[n - i] + Pnx(a, x, n, i - 1)*x;
else
return a[n];
}
代码要计算的是Pnx的值,公式如下
为了方便解释,我上面a的长度写的很短,现在我用图来说明代码的递归过程(有点潦草,见谅)
因为是手写的,没有电脑制作看着方便,我解释一下上面的过程。
递归,首先是递的过程,在这个过程中,你必须要给一个出口,告诉系统到什么地方,递的过程才结束,我这个代码中,递的过程到i<0时结束,所以一旦i<0递就结束了,接下来就是归的过程,他会把最后一个数据返回到上一个数据,然后依次返回,直到第一个数据,归的过程也结束了,这时候系统就得到递归的结果。
在写递归函数的过程中,出口和入口都是必不可少的,要想用法递归,你需要把握2个方面
1.规律:一般来说简单的就是从头到尾,还是从尾到头,复杂的就具体情况,具体分析
2.出口:根据规律来设置,我这个代码是简单的从头到尾,所以出口是最后一个数据
我这举一个例子,大家都熟悉的斐波拉契数列,他的规律很简单
显然,你找不到斐波拉契数列的最后一个数据,所以他采用从尾到头的方式来计算,如果假设f(0)=0(实际也是0),那么斐波拉契前面的数据就是0,1,1,2,3,5…
代码如下
int Fibonacci(int n)
{
if (n == 0)
return 0;
else if (n == 1)
return 1;
else
{
return Fibonacci(n - 1) + Fibonacci(n - 2);
}
}