先放上数据结构的学习建议的链接知乎,如何学习数据结构 我使用的学习视频链接清华大学:数据结构学堂在线慕课网
这是自己印象比较深刻的一个案例,先写出来作引子。
先给出一个调论较多的斐波那契数列的求解问题: 对于f(n)有f(n) = f(n-1)+f(n-2);f(0) = 1,f(1) = 1; 这也是跳台阶问题:一只青蛙可以跳一个台阶,也可以跳二个台阶,问它跳n个台阶时一共有多少种跳法? 其答案就是斐波那契f(n)的解。 如果用编程如何实现呢? 观察数学等式可以轻易发现,其是递归函数。所以, 一找出递归过程及f(n) = f(n-1) + f(n-2); 二找出递归基,及f(0) = 1,f(1) = 1; 于是有递归方案: long Fibonacci(int n) { if(n == 0 || n == 1)//递归基 return 1; else return Fibonacci(n-1)+Fibonacci(n-2); } 递归能很好的把问题简化的分析出来,代码也是只要有递归过程和递归基,两三行就写出来。 其计算是符合有输入、有输出、有穷性、可行性、切确性的基本特征。但其效率性是很低的。其时间 复杂度为O(2^n),在设计中该时间复杂度的算法被认为是不可行的,因为其时间复杂度远大于计算机 在有限时间内能处理的能力。 所以,得到问题的解决方法,再来考虑解决问题的效率。 递归是由后往前再由前往后计算的,这是数学等式给我们的规律。而回到青蛙跳台阶,其是从 前往后计算的过程的。是原来问题的逆过程。及,要知道到达n的结果,不妨放弃要知道n-1和n-2 的结果和往后推的结果。改为由前往后计算的顺过程,先有f(0) = 1,f(1) = 1, f(2) = f(0)+f(1) = 2,f(3) = f(2)+f(1) = 3...f(n-1) = f(n-2)+f(n-3), f(n) = f(n-1)+f(n-2)这样顺推下去,于是有 long Fibonacci(int n) { long g = 1,f = 1;//表示第n = 1,n = 0时 //while(--n) for(int i = 1;i < n; ++i)//从底向高求 { g = g+f;//f(n) = f(n-1)+f(n-2);f(n-1),f(n-2)已知 f = g-f;//f(n-1) = f(n)-f(n-2);保留f(n-1),去掉f(n-2)把计数向上移 } return g; } 递归帮我们轻易的了解到计算的规律,我们把问题规模为n的,分解成规模为n-1的规模,且n 和n-1又具有完全相同的性质,所以可以延用解决n规模的方法解决n-1规模的问题,一直把问题分 解成我们能轻易解决的一个个简单子问题,这是“减而治之”的解决思想。在递归的解决方法中还有 一个“分而治之”的思想,这个例子中直接给出了数学等式,在实际问题中可能我们要将问题以数学的 方式抽象出来。其大概的过程是先找到问题可行的解决方案,再在此基础上找规律得到高效率的解决方法。