Skip to content

2.4 C#语法的学习(四) && 递归

L edited this page Feb 15, 2020 · 3 revisions

递归是一个对初学者来说不太好理解的概念,要我说的话,我觉得像俄罗斯套娃,像下面这种图。
01300542392970142155806822944_s
递归是不停的调用自己,并在达到某个条件的时候停止递归,返回结果。

我们尝试下解决这样的问题:斐波那契数列
斐波那契数列的排列是: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
20200215_100039

实际上部分问题用循环、递归都可以解决,但部分问题只能使用递归解决,所以掌握递归的思想是非常重要的。递归更多的用在,我们也不知道什么时候“结束”的情况下。

示例代码

FibonacciNumber

参考资料

搜索“递归算法”,我们可以得到很多写的很好的博客,我在这里列出一些。
递归算法详解
算法——递归问题