递归是一个对初学者来说不太好理解的概念,要我说的话,我觉得像俄罗斯套娃,像下面这种图。
递归是不停的调用自己,并在达到某个条件的时候停止递归,返回结果。
我们尝试下解决这样的问题:斐波那契数列
斐波那契数列的排列是:0,1,1,2,3,5,8,13,21,34,55,89,144……它后一个数等于前面两个数的和。在这个数列中的数字,就被称为斐波那契数。现在想计算第n个斐波那契数是多少?
第n个斐波那契数=第n-1个斐波那契数+第n-2个斐波那契数
第n-1个斐波那契数=第n-2个斐波那契数+第n-3个斐波那契数
第n-2个斐波那契数=第n-3个斐波那契数+第n-4个斐波那契数
.......
没完没了┌(。Д。)┐
但是!它也会有结束的地方:第1个斐波那契数=0,第2个斐波那契数=1。
所以整件事情就变成了:
求第n个斐波那契数,就要求第n-1个斐波那契数和第n-2个斐波那契数;
求第n-1个斐波那契数,就要求第n-2个斐波那契数和第n-3个斐波那契数;
.......
求第3个斐波那契数,就要求第1个斐波那契数和第2个斐波那契数;
求第1个斐波那契数返回0,求第2个斐波那契数返回1。
而求第x个斐波那契数的方法是一模一样的。现在我们就可以开始写代码了:
internal static int GetFibonacciNumber(int n)
{
if (n > 2)
{
//递归:获得n-1和n-2的数
return GetFibonacciNumber(n - 1) + GetFibonacciNumber(n - 2);
}
//n=1返回0,n=2返回1
return n-1;
}
如果依然不能理解,可以通过调试,看看程序是怎么走的,帮助自己理解。
当n=4时,执行代码段return GetFibonacciNumber(3) + GetFibonacciNumber(2);
(1)先调用GetFibonacciNumber(3),执行代码段return GetFibonacciNumber(2) + GetFibonacciNumber(1);
GetFibonacciNumber(2)返回1,GetFibonacciNumber(1)返回0
之后GetFibonacciNumber(3)返回1
(2)再调用return GetFibonacciNumber(3) + GetFibonacciNumber(2);
中的GetFibonacciNumber(2),返回1
(3)最后计算GetFibonacciNumber(3) + GetFibonacciNumber(2),返回2
实际上部分问题用循环、递归都可以解决,但部分问题只能使用递归解决,所以掌握递归的思想是非常重要的。递归更多的用在,我们也不知道什么时候“结束”的情况下。