无法理解递归函数求值逻辑,为何该JS函数总能返回数组最小值
该递归函数总能返回数组最小值的原因
这个函数是基于递归逐步缩小问题规模的思路实现的最小值查找逻辑,原理很容易理解:
- 基础边界:当传入的数组长度
N为1时,数组里只有唯一元素A[0],它本身就是最小值,直接返回即可。 - 递归逻辑:要查长度为
N的数组的最小值,就先查前N-1个元素的最小值,再拿这个最小值和第N个元素(数组下标从0开始,对应A[N-1])比较,返回两者中更小的那个即可。
举你给出的[12,3,8,5]数组为例,实际执行流程是这样的:
F4([12,3,8,5], 4) → 先算前3个元素的最小值,再和第4个元素5比较
↳ F4([12,3,8,5], 3) → 先算前2个元素的最小值,再和第3个元素8比较
↳ F4([12,3,8,5], 2) → 先算前1个元素的最小值,再和第2个元素3比较
↳ F4([12,3,8,5], 1) → 触发边界条件,返回12
↳ 12和3比较,返回3
↳ 3和8比较,返回3
3和5比较,返回3
不管最小值放在数组的哪个位置,只要递归遍历到它所在的对比层,它就会作为更小值被一直向上传递到最外层调用,所以永远能得到正确的最小值。
小优化建议
你现在的写法存在重复执行递归的问题:if判断里执行了一次F4(A,N-1),符合条件的return里又执行了一次,同一个子问题会被计算两次,数据量大的时候性能很差,可以改成先缓存前N-1个元素的最小值再比较:
function F4(A,N) { if(N==1){ return A[0] } // 缓存前N-1个元素的最小值,避免重复递归 const preMin = F4(A, N-1) return preMin < A[N-1] ? preMin : A[N-1] }
内容的提问来源于stack exchange,提问作者funtyper
相关产品推荐
相关产品推荐

