2.4 C#语法的学习(四) && 递归
递归是一个对初学者来说不太好理解的概念,要我说的话,我觉得像俄罗斯套娃,像下面这种图。
递归是不停的调用自己,并在达到某个条件的时候停止递归,返回结果。
我们尝试下解决这样的问题:斐波那契数列
斐波那契数列的排列是: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
实际上部分问题用循环、递归都可以解决,但部分问题只能使用递归解决,所以掌握递归的思想是非常重要的。递归更多的用在,我们也不知道什么时候“结束”的情况下。
示例代码
参考资料
学习技术最好的文档就是【官方文档】,没有之一。
还有学习资料【Microsoft Learn】、【CSharp Learn】、【My Note】。
如果,你认为阅读这篇博客让你有些收获,不妨点击一下右下角的【推荐】按钮。
如果,你希望更容易地发现我的新博客,不妨点击一下【关注】。