递归问题思考与复盘
递归问题实际上是将一个大的问题分解成几个小的问题,然后将小的问题再次分为更小的问题,然后就这样重复操作下去最后到最小的问题我们能够解决,然后再解决上一个较小的问题,直到解决这个大问题。
举个栗子
我们面试的时候可能会遇到这个问题,走楼梯,你一次只能上一层台阶或者两层,那么走到第n层有几种走法呢。
思考
一次只能上一层或者两层,那么走上第n层,他必定是从n-1层或者n-2层上来的,我们只需要计算走上n-1和n-2层的走法然后相加就可以知道n层的结果了,可是怎么计算第n-1和n-2的结果呢,然后们再次进行相同的思考,计算n-1,我们需要知道n-2和n-3,计算n-2需要知道n-3和n-4,然后依次类推,最后需要计算第一层和第二层的方法,可以知道第一层是一种,第二层是两种。用一个函数来描述就是:f(n)=(f(n-1)+f(n-2)
用递归函数解决
int f(int n) {
if (n == 1) return 1;
if (n == 2) return 2;
return f(n-1) + f(n-2);
}
但是进一步思考这样写会有很多重复计算和堆栈溢出问题,就比如上面我们重复计算n-3,这样会造成很多计算资源浪费,我们可以使用一种数据结构hashmap来解决,对于堆栈溢出问题,我们则可以设置限制递归调用的最大深度的方式来解决这个问题,如果调用的深度超过某个值我们就停止调用并提示。