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

    参考资料

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

  • 相关阅读:
    hdu 4027 Can you answer these queries? 线段树
    ZOJ1610 Count the Colors 线段树
    poj 2528 Mayor's posters 离散化 线段树
    hdu 1599 find the mincost route floyd求最小环
    POJ 2686 Traveling by Stagecoach 状压DP
    POJ 1990 MooFest 树状数组
    POJ 2955 Brackets 区间DP
    lightoj 1422 Halloween Costumes 区间DP
    模板 有源汇上下界最小流 loj117
    模板 有源汇上下界最大流 loj116
  • 原文地址:https://www.cnblogs.com/Lulus/p/12343038.html
Copyright © 2011-2022 走看看