最近在看一本书:算法图解,而后恰好看到了递归,自觉得很简单的嘛,而后就啪啪啪的打脸了。为啥缘由被打脸呢?请看下面简单的递归求数组和的函数:
算法
function sum (arr, value){
if(arr.length){
value += arr.pop();
sum(arr,value);
}
return value;
}
sum([1,2,3],0);
复制代码
若是执行以上代码,你会发现:最终结果返回了3。当时非常纳闷?为何会产生这个结果呢,
数组
带着这个疑问 我就好好又温习了一遍递归章节
首先你必须知道 递归的两大条件:基线条件和递归条件
一、基线条件:指的是中止调用本身的条件
二、递归条件:指的是调用自身的条件
bash
知道了两大条件后咱们还须要了解到 递归函数的原理:既计算机是如何调用递归式的函数:
一、计算机中有一个调用栈的内存空间,这个空间 专门用于存放计算机将要调用的函数列表。
二、调用栈的两种使用方式,压入栈和弹出栈,这两个方法,好似存放和再拿出来使用。
三、递归函数,其实刚开始执行时,是先把已知的待执行函数都存放到调用栈中,而后依次执行,因为栈是先进后出的,因此递归函数的执行顺序是和咱们想象中的有所不一样的。
函数
好了,了解完递归的原理后,咱们再拿开篇的函数sum 执行你会发现,刚开始执行时:sum([1,2],3)被放到待执行栈中。而后依次是sum([1],5)、sum([],6) 由于栈的特性:因此执行顺序恰好是相反的,sum([],6) => sum([1],5) => sum([1,2],3) 因此咱们最终获得的 3
具体执行顺序请看完整的流程图:
ui
其实正确的写法很简单,并不须要传递多余的参数:
spa
function sum(arr){
if(arr.length){
return arr.pop() + sum(arr)
}
return 0
}
sum([1,2,3]);
复制代码
你get 到递归函数的技能了吗?code