zoukankan      html  css  js  c++  java
  • 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

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

    示例代码

    FibonacciNumber

    参考资料

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

  • 相关阅读:
    内部类
    this关键字
    封装
    构造方法
    类图
    StringBuffer
    String
    导包
    包名规范
    带参数的方法
  • 原文地址:https://www.cnblogs.com/Lulus/p/12343038.html
Copyright © 2011-2022 走看看