递归递归,字面意思就是递和归,递也就是你一直传递数据,归就是传递到最后返回的过程,这样说太抽象,先上一个代码在解释。
#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); } }