考察点
递归与迭代
知识点
递归和迭代是俩种不同的计算机思维,是解决某一类问题的俩种方法,不是算法本身,方法可
以引导算法的形成。最常见的这类问题的特点就是它可以被分解成完全相同的小规模问题。递
归是自上而下的,是描述性的,f(n)=f(n-1)***,算法思路一般就是把问题描述出来就可
以,假设n-1规模的问题已经处理好了如何处理n规模的问题。迭代是自下而上的,往往是从
f(1)开始,算法思路是通过各种手段想办法先直接处理n=1规模的问题,然后思考如何从f(1)
推导出f(n),或者逼近f(n)。计算机中递归是通过函数栈来实现的,每一次递归调用都需要
进程在自己的内核栈中申请空间用于存储局部变量,返回地址等信息,等调用结束了再销毁栈
,所以每次递归调用会有栈的时间消耗,因此递归的效率比较低。与此同时递归存在重复计算
的问题,想象一下f(n-1)和f(n-2)是不是都会计算一遍f(n-3)呢。由于进程的栈空间是
有限的,因此如果递归层次较多的话会存在栈溢出的风险
题目
分析
是很典型的大问题可以分解成同类小问题这类题目。遇到这类问题我们就要思考是用递归还是迭代的方法去解,递归往往更简单,侧重于描述问题,f(n)可以用f(n-1)和f(n-2)计算出来,迭代效率更高,从f(1)开始如何可以推导出f(n)
public class Nine {
public static void main(String[] args) {
System.out.println(fibonacci(20));
System.out.println(fibonacciIteration(20));
}
public static long fibonacci(int n) {
if (n == 0) {
return 0;
}
if (n == 1) {
return 1;
}
return fibonacci(n-1) + fibonacci(n-2);
}
public static long fibonacciIteration(int n) {
if (n == 0) {
return 0;
}
if (n == 1) {
return 1;
}
long one = 0;
long two = 1;
long fn = 0;
for (int i = 2;i<=n;i++) {
fn = one + two;
one = two;
two = fn;
}
return fn;
}
}